-3

そのため、入力 (数式) を受け取り、それを後置表記に変換してユーザーに出力するプログラムを作成しています。このプログラムを単純な数式 (つまり5 + 1 - 3 * 2) で実行すると、うまく機能します。問題は、括弧を入れるときです。適切な場所ではなく、最後の行にすべての数学演算子を出力します。数学演算子を適切な場所に配置する必要があります。(つまり5 1 + 3 - 2 *)。助言がありますか?

このステートメントの実際の出力は、5 - ( 2 * 3 ) + 5I 5 2 3 5 * - +need it to look like5 2 3 * - 5 +

#include <iostream>
#include <stack>
#include <string>
#include <sstream>
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 == "*")
  {
    return 2;
  }
}
void welcome()
{
 cout << "blah blah!" << endl;
 }
int main()
{   

welcome(); // welcome text

stack <string> myStack; 
char line[256]; 
cin.getline( line, 256); 
string exp = line;
string item;
string output = ""; 

istringstream iss(exp);

iss >> item;

while(iss)
{
    if(item != "+" && item != "-" && item != "/" && item != "*" && item != "(" && item != ")") //If the char is a number
    {
        cout << item << endl;
    }
    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 
            {           
                string dpu = myStack.top();
                myStack.pop();
                output = output + dpu + " "; 
            }
            myStack.push(item);
        }
    }
    else if(item == "(") // left peren
    {
        myStack.push(item);
    }
    else if(item == ")") // right peren
    {
        while(myStack.top() != "(")
        {
            string dpu = myStack.top();  
            myStack.pop();
            output = output + dpu + " "; 
        }
        myStack.pop();
    }
    iss>> item; 
}
while (myStack.size() > 0 )
{
    string dpu = myStack.top(); 
    output = output + dpu + " ";
    myStack.pop();
}
cout<< output << endl;
}
4

1 に答える 1

1

まあ...あなたのコードでは、数字は常に他の何よりも前に出力されます:

if (item != "+" && item != "-" && item != "/" && item != "*" && item != "(" && item != ")") //If the char is a number
{
    cout << item << endl;
}

私はあなたが要求している表記に慣れていませんが、スタックはこのタスクに適したデータ構造ではないようです...解析しているので、ツリーを使用する方が良いようです

于 2013-04-19T14:16:16.910 に答える