我正在尝试使用两个堆栈来评估中缀表达式,但是,我的程序不断出现分段错误,我不确定导致错误的原因。我已经尝试过遵循RPN算法的伪代码,但是我认为当我调用doOperation时会出现问题。我不确定调用它时要包含哪些参数。我知道我需要一个(ValueType,char,ValueType),但是我不想写doOperation(ch,ch,ch),因为我很确定它不会有帮助。任何人都可以帮我找出一种方法来调用这个函数吗? (我非常确定导致分段错误的原因之一)。
答案 0 :(得分:0)
opStack
中的valStack
和doOperation
应使用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
中定义的valueStack
和doOperation
没有项目。 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
的声明不存在 - 您应该保留该声明。
那么,以上几行中发生了什么:
您可以创建堆栈opStack
和valStack
。这两个都是空的。
你调用.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;是执行运算符时发生的事情。