在C ++中使用Stacks用于中缀和后缀表达式

时间:2011-01-23 07:44:25

标签: c++ data-structures stack postfix-notation infix-notation

我正在编写一个程序,它接受用户输入并使用堆栈将基于优先级的中缀表达式转换为后缀表达式,操作数总是在运算符之前。例如,如果用户输入:

(A + B * C)

然后程序应显示:

ABC * +

到目前为止,我有这个:

#include <iostream>
#include <stack>
#include <string>


using namespace std;

int main()
{
    stack<char> s;
    char input;
    while (cin.get(input) && input != '\n')
        {
            if (isalnum(input))
                cout << input << "\n";
            else if (input == '(')
                s.push(input);
            else if (input == ')')
            {
        while (!s.empty() && s.top() != '(')
            {
            cout << s.top();
            s.pop();
        }
            if(!s.empty()) 
                    s.pop();
            else
                cout << "ERROR: No Matching ( \n";
        }
     else if (s.empty() && input == '*'||'/'||'+'||'-' && s.top() < input) // Error Begins Here?
     {
         char a = '*';
         char b = '/';
         char c = '+';
         char d = '-';
         bool prec (char a, char b, char c, char d);
             return ('*' > '/' > '+' > '-');
             s.push(input);
     }
         else if (input == '*'||'/'||'+'||'-' && s.top() >= input)
             while (!s.empty()) 
          {
              cout << s.top();
          s.pop();
                  s.push(input);
          }
        }
    while (!s.empty())
    {
        cout << s.top();
        s.pop();
    }
}

编译并运行但不能正常运行。当输入类似“ab”的表达式时,程序将显示“ab”,但如果输入“a + b + c”,则仅显示“a”。这意味着程序不会将操作符放入堆栈中以便稍后显示。我需要帮助的是修改程序,以便在输入操作符时,它应该被添加到堆栈中,然后根据操作数之后的优先级(*&gt; /&gt; +&gt ;-)显示,当输入时完了。

我对C ++和编程很新,所以任何建议都会很棒。

3 个答案:

答案 0 :(得分:2)

else if (input == '*'||'/'||'+'||'-' && s.top() >= input)

这不符合你的想法。你需要做

else if (input == '*'|| input == '/'|| input == '+'|| input == '-' && s.top() >= input)

这看起来也像是一个错误

bool prec (char a, char b, char c, char d);

这是函数原型的语法。你确定这会编译吗?

答案 1 :(得分:2)

问题在于:

bool prec (char a, char b, char c, char d);
return ('*' > '/' > '+' > '-');

我猜这是为了定义一个优先级函数,但这不是它正在做的事情。第一行声明存在这样的函数(并且它的参数与前面行中声明的变量无关),第二行导致整个程序终止。如果你想要这样的函数,你必须在main之外定义它。

这里有一个稍微不那么引人注目的错误:

if (s.empty() && input == '*'||'/'||'+'||'-' && s.top() < input)

首先,这部分

input == '*'||'/'||'+'||'-'

被解释为

(input == '*') || ('/') || ('+') || ('-')

最后三个条款是真的,第一个是无关紧要的。如果s为空,我甚至不确定s.top()会做什么。

这应该足以继续下去了。我建议你首先构建和测试例程,例如,在尝试将所有内容放在一个程序中之前,识别运算符并评估它们的优先级。

答案 2 :(得分:0)

Falmarri是对的,只是想张贴我的自己,并且编译我尝试了,但还有另一件事:你说 else if (s.empty() && input == '*'||'/'||'+'||'-' && s.top() < input) // Error Begins Her E'  你确定甚至达到了这一点,因为当我跑了它时,它就停在了:

while (cin.get(input) && input != '\n')

直到我按下Enter键,在cin.get(输入)中你可以从consol输入多个char,但输入只包含你输入的第一个char。为了解决这个问题,我只想说一个 #include <conio.h>一开始使用

while ((input = getch()) && input != (char)13) in staid of you're code  

简短说明

getch()
仅按下一个字符后

返回

输入!=(字符)13 在staid中是必需的 输入!='\ n' 因为getch()返回(char)13对于ENTER,请参阅ASCII表以获取更多信息。