0
    #include <iostream>
    #include <stack>
    #include <string>
    #include <sstream>

    using namespace std;

    stack<char> aStack;
    stringstream result;
    stack<char> operand1;
    stack<char> operand2;


    stringstream &postfixExp(string ch){
      for(int i =0; i< ch.length(); i++)
      {
        if(ch[i]== '1' || ch[i]== '2' || ch[i]== '3' || ch[i]== '4' || ch[i]== '5' || ch[i]== '6' || ch[i]== '7' || ch[i]== '8' || ch[i]== '9' || ch[i]== '0' )
        {
          aStack.push(ch[i]);
        }

        else if( ch[i]== '+')
        {
          operand2.push(aStack.top());
          aStack.pop();

          operand1.push(aStack.top());
          aStack.pop();

      result << ( operand1.top() + operand1.top());
    }

  }

  return result;
}

int main()
{
    string postfix = " 2+3";

    stringstream* answer = &postfixExp(postfix);
    cout << "Result = " << answer->str() << endl;;


  return 0;
}

大家好,有人知道我的代码有什么问题吗?我没有看到来自编译器的任何错误消息。但是,当我运行它时它崩溃了。

我很难显示我从函数中得到的结果。一开始想用栈函数,但是想不出怎么把值传给main函数并显示出来。

然后我正在考虑改用 stringstream 函数。不幸的是,我仍然不知道如何显示相应的结果

我想知道是否有人可以告诉我代码中的哪一部分有问题,或者是否有更好的方法来显示函数的结果,而不是使用 stringstream 或 stack

非常感谢!

4

2 回答 2

1

正如已经指出的那样,错误是由容器为空aStack.pop();时调用引起的。aStack这可能会产生未定义的行为(在这种情况下),您可以将其视为应用程序的崩溃。

解释很简单,你"2+3"逐个字符地处理字符串:

for each character:
    if it is digit:
        push it to stack
    if it is '+':
        pop 2 elements

...那么,一旦到达标志,您认为"2+3"字符串中会发生什么?'+'


还可以考虑重新设计:

stringstream result;

stringstream& postfixExp(string ch) {
    ...
    return result;
}

...您正在返回对全局变量的引用,这意味着您不应该返回任何内容,或者该变量不应该是全局的。更好的是,考虑只传递std::string对象(stringstream在函数中本地使用):

std::string postfixExp(const std::string& expression) {
    std::ostringstream resultStream;
    ...
    return result.str();
}
于 2013-09-23T20:00:38.000 回答
0

后缀算术运算的测试输入应该是“23+”的形式,而不是“2+3”。

正如其他人所提到的,可能应该添加一些检查以确保您不会从空堆栈中弹出。

于 2013-09-23T19:58:46.257 回答