0

「a + b * cd / e」を後置形式に変換するアルゴリズムに取り組んでいます。http://en.wikipedia.org/wiki/Shunting-yard_algorithm wikiを用意しましたが、ロジックに問題があります。キューを印刷すると、演算子なしで「abcd e」が表示されます。スタックに何もプッシュされていないようです。または、そうである場合、キューにプッシュされていません。私のキュー/スタックは、私が作成した二重リンク リスト クラスによって実装されています。

#include <iostream>
#include "LinkedList.h"
#include "Stack.h"
#include "Queue.h"
using namespace std;

int oper(char c)
{
    switch(c)    {
        case '!':
            return 4;
        case '*':  case '/': case '%':
            return 3;
        case '+': case '-':
            return 2;
        case '=':
            return 1;
    }
    return 0;
}



int main () {

    LinkedList* list = new LinkedList();


    string infix = "a+b*c-d/e";
    Stack *holder = new Stack();
    Queue *newstring = new Queue();
    int length = infix.length();
    char temp;
    char prev;
    for(int i=0; i<length; i++)
    {
        temp = infix[i];
        if((temp == '+') || (temp == '-') || (temp == '*') || (temp == '/'))
        {
            if (holder->isEmpty())
            {
                holder->push(temp);
                prev = temp;
                continue;
            }
            if(oper(temp)<oper(prev))
            {
            newstring->queue(holder->popStack());
            temp = '\0';
            continue;
            }   
            else
            holder->push(temp);
            prev = temp;
        }
        else 
        newstring->queue(temp);

}
while(!holder->isEmpty())
{
    newstring->queue(holder->popStack());
}
newstring->printQueue();



    return 0;
}
4

1 に答える 1

1

あなたのコード部分::

        if(oper(temp)<oper(prev))
        {
        newstring->queue(holder->popStack());
        temp = '\0';
        continue;
        }   

コードのこの部分はまったくヒットしません ...... 入力 "a+b*cd/e" で提供される文字列

これを参照してください::

 if(oper(temp)<oper(prev))

条件は、変数 temp で現在スキャンされている演算子に対する前の演算子の優先度を確認することですが、前の if ステートメント (スタックが空の条件) の外側にステートメントがなく、使用可能なオプションから prev 変数を抽出または割り当てます。したがって、スタックでは、「+」の初期値が if 条件の評価に使用されます。これは、「*」および「\」よりも小さく、「-」と同じレベルですが、2 番目の if の結果として大きくはなりません。条件が満たされることはなく、ヒットすることはありません。

それがおそらく pop するとスタックから何も出てこない理由であり、それが現在の結果を取得する方法です。コードにもう一度アクセスして、適切な変更を加える必要があります。

これがお役に立てば幸いです。良い一日をお過ごしください。

于 2013-03-17T09:35:29.227 に答える