0

だから、私はこのプログラムに問題があります。ここで私が間違っていることを誰かに教えてもらえますか? このプログラムは、単純な中置表記の数式 (例: "5 - 2 + 1") を取り、それを (例: "5 2 - 1 +") に変換し、4 になるようにそれを解くことになっています。しかし、評価部分に入るとすぐに、コマンドプロンプトには何も表示されません。助けてもらえますか?ありがとう!

#include <iostream>
#include <stack>
#include <string>
#include <sstream>
#include <vector>
using namespace std;


int priority(string item) //prioritizing the operators
{
if(item == "(" || item == ")")
{
    return 0;
}
else if(item == "+" || item == "-")
{
    return 1;
}
else //if(item == "/" || item == "*") <-- guess didnt need to define this one
{
    return 2;
}
}
void welcome()//welcome text
{
   cout << "Welcome to this program!" << endl;
    cout << "Please enter your equation" << endl;
}

int main()
{
    welcome(); // welcome text

stack <string> myStack; // initializing the stack.
char line[256];
cin.getline( line, 256); // this and the proceeding line get the input.
string exp = line;
string item;
string postFix;

istringstream iss(exp);

iss >> item;

while(iss)
{
    if(item != "+" && item != "-" && item != "/" && item != "*" && item != "(" && item != ")") //If the char is a number
    {
        cout << item;
        postFix = postFix + item;
    }
    else if(myStack.size() == 0) // If the stack is empty
    {
        myStack.push(item);
    }
    else if( item == "+" || item == "-" || item == "/" || item == "*") //If the char is an operator
    {
        if(priority(myStack.top()) < priority(item)) // the item on the stack is greater priority than the array item
        {
            myStack.push(item);
        }
        else
        {
            while(myStack.size() > 0 && priority(myStack.top()) >= priority(item)) //while the stack contains something, and the item on 
            {           
                cout << myStack.top();
                postFix = postFix + item;
                myStack.pop();
            }
            myStack.push(item);
        }
    }
    else if(item == "(") // left peren
    {
        myStack.push(item);
    }
    else if(item == ")") // right peren
    {
        while(myStack.top() != "(")
        {
            cout << myStack.top();
            postFix = postFix + item;
            myStack.pop();

        }
        myStack.pop();
    }
    iss >> item; 
}

    while (myStack.size() > 0 ) //When nothing is left to evaluate
     {
        cout << myStack.top();
    postFix = postFix + myStack.top();
    myStack.pop();
}
   cout << endl;
    //PART 2

int x1;
int x2;
int x3;

stack<int> thirdStack;
string exp2 = postFix;
string item2;

istringstream iss2(exp2);

iss2 >> item2;

while(iss2)

    if(item2 != "+" && item2 != "-" && item2 != "/" && item2 != "*") //if its a number
    {
        int n;

        n = atoi(item2.c_str());
        thirdStack.push(n);
    }
    else if( item2 == "+" || item2 == "-" || item2 == "/" || item2 == "*") //if its an operator
    {
            x1 = thirdStack.top();
            thirdStack.pop();
            x2 = thirdStack.top();
            thirdStack.pop();
        if(item2 == "+")
        {

            x3 = x1 + x2;
            thirdStack.push(x3);
        }
        else if(item2 == "-")
        {

             x3 = x1 - x2;
             thirdStack.push(x3);
        }
        else if(item2 == "/")
        {

             x3 = x1 * x2;
             thirdStack.push(x3);
        }
        else if(item2 == "*")
        {
            x3 = x1 / x2;
            thirdStack.push(x3);
        }
    }
}
cout << "The conversion into infix notation is" + thirdStack.top() << endl;
 } 
4

1 に答える 1

1

このコードには多くの問題があります。

パート 1 では、コードは正しい後置変換を書き出すように見えますが、それが構築する postFix 文字列は同じではありません。

たとえば、次のようなコードがある場所もあります。

cout << myStack.top();
postFix = postFix + item;

書き出していますが、postFix の結果にmyStack.top()追加しています。itemこれは次のようになります。

cout << myStack.top();
postFix = postFix + myStack.top();

さらに、postFix 文字列に追加する各項目の間にスペースを含める必要があります。したがって、結果は5 2 - 1 +ではなくになり52-1+ます。そうしないと、その式を解釈しようとすると、最初の項目が 52 として解釈されます。

iss2 >> item2;パート 2 では、while ループの最後でへの呼び出しがありません。基本的に、最初の項目を何度も解釈しているだけなので、コードは無限ループに陥ります。

また、計算では、オペランドの順序が正しくありません。これは、足し算と掛け算には関係ありませんが、引き算と割り算には関係があります。たとえば、減算計算はx3 = x2 - x1;ではなくすべきですx3 = x1 - x2;

最後に、結果をストリーミングするときは、ストリーム オペレーターが必要な場合にプラスになります。次のようになります。

cout << "The conversion into infix notation is" << thirdStack.top() << endl;
于 2013-05-03T02:51:27.447 に答える