2014-03-19 47 views
0

我正在嘗試使用兩個堆棧來評估中綴表達式,但是,我的程序不斷收到分段錯誤,我不確定是什麼導致了錯誤。我嘗試了RPN算法的僞代碼,但是我認爲當我調用doOperation時會出現我的問題。我不確定調用此參數時要包含哪些參數。我知道我需要一個(ValueType,char,ValueType),但是我不想寫doOperation(ch,ch,ch),因爲我非常確定這不會有幫助。任何人都可以幫我找出一種方法來調用這個函數嗎? (我很確定這是導致分段錯誤的原因之一)。Infix Expressions

回答

0

opStackvalStack in 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)

此外,當前的分段錯誤發生是因爲opStackvalueStack中定義的doOperation沒有項目。 top()將引用noexist值。

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,因爲這就是它的確。「操作」是執行操作員時發生的事情。