中缀表达式

时间:2014-03-19 01:55:58

标签: c++ stl stack infix-notation

我正在尝试使用两个堆栈来评估中缀表达式,但是,我的程序不断出现分段错误,我不确定导致错误的原因。我已经尝试过遵循RPN算法的伪代码,但是我认为当我调用doOperation时会出现问题。我不确定调用它时要包含哪些参数。我知道我需要一个(ValueType,char,ValueType),但是我不想写doOperation(ch,ch,ch),因为我很确定它不会有帮助。任何人都可以帮我找出一种方法来调用这个函数吗? (我非常确定导致分段错误的原因之一)。

2 个答案:

答案 0 :(得分:0)

opStack中的valStackdoOperation应使用processExpression中的变量。

它的功能原型应该是这样的:

ValueType doOperation(ValueType operandL, char operation, ValueType operandR, stack<char>& opStack, stack<ValueType>& valueStack)

注意最后两个参数:stack<char>& opStack, stack<ValueType>& valueStack。它们必须是指针传递的或引用传递的,而不是值传递的。

processExpression拨打doOperation,如下所示:doOperation(operandL, ch, operandR, opStack, valueStack)

此外,当前的分段错误发生是因为opStack中定义的valueStackdoOperation没有项目。 top()将引用noexist值。

答案 1 :(得分:0)

尝试从doOperation中删除这些行:

stack<char> opStack;
stack<ValueType> valStack;

operandR = valStack.top();
valStack.pop();

operandL = valStack.top();
valStack.pop();

operation = opStack.top();
opStack.pop();

请注意,您double result的声明不存在 - 您应该保留该声明。

那么,以上几行中发生了什么:

  • 您可以创建堆栈opStackvalStack。这两个都是空的。

  • 你调用.top(),当堆栈为空时它会做坏事。 .pop()也会在空堆栈上做坏事。

  • 您正在尝试为传入的参数指定值。即使这样成功,您的参数也将毫无用处。您最终会以任何方式在函数中创建/初始化它们。

现在,删除上述内容后,您需要将来电更改为doOperation。在processExpression中,您需要在调用doOperation之前进行这些调用:

operandL = valStack.top();
valStack.pop();

operandR = valStack.top();
valStack.pop();

operation = opStack.top();
opStack.pop();

doOperation(operandL, operation, operandR)

哪个不漂亮,特别是当你拨打doOperation三次时这样做,但这只是一个开始。第一个目标是获得工作代码。如果你以后再这么倾向,你可以把它变得漂亮。

此外,这有点迂腐,但您应该将operation变量重命名为operator,因为这就是它的真实含义。 &#34;操作&#34;是执行运算符时发生的事情。