使用棧完成算術表示式的計算

2022-09-23 10:06:13 字數 1614 閱讀 3143

基本思路:為了完成算術表示式的計算,用到了兩個棧,乙個用於存放運算元,另乙個用於存放操作符。

假設:程式中定義了兩個棧:operandstack(用來存放運算元)、operatorstack(用於存放操作符)。

在處理運算元和操作符之前,首先將它們壓入棧中。當要處理乙個操作符時,從operatorstack中將它彈出,然後將它應用在來自operandstack的前兩個運算元上,得到的結果再壓入operandstack中。

實現的詳細步驟:

掃瞄階段:程式從左到右掃瞄表示式,提取運算元、運算子和括號。

如果提取的字元是乙個運算元,將它壓入operandstack中。

如果提取的字元是乙個+或-的運算子,因為+、-運算子在算術表示式中的優先順序是最低的,所以此時在將+或者-運算子插入棧中之前,可以處理operatorstack棧頂的所有運算子,最後將提取出來的運算子壓入operatorstack中。

如果提取的字元是乙個*或/的運算子,則處理operatorstack棧頂的所有*和/的運算子,最後將新提取出來的運算子壓入operatorstack中。

如果提取出來的運算子是乙個"(",則將它壓入operatorstack中。

如果提取出來的運算子是乙個")",則重複處理operatorstack棧頂的運算子,直到看到棧頂的運算子為")"。

清除棧階段:重複處理來自operatorstack棧頂的運算子,直到operatorstack為空為止。

**實現:

public static int evaluateexpression(string expression)else if(chararr[i].trim().equals("+") || chararr[i].trim().equals("-"))

operatorstack.push(chararr[i].charat(0));//將操作符壓入操作符棧中

}else if(chararr[i].trim().equals("*") || chararr[i].trim().equals("/"))

operatorstack.push(chararr[i].charat(0));

}else if(chararr[i].trim().equals("("))else if(chararr[i].trim().equals(")"))

operatorstack.pop();//將進行過計算的左括號彈出

}else

}//對棧中資料進行計算,知道棧為空為止

while(!operatorstack.isempty())

//此時運算元棧中的棧頂元素也就是計算結果

return operandstack.pop();

}/**

* 對操作符棧頂的乙個操作符進行計算

* @param operandstack

* @param operatorstack

*/public static void processoneoperator(stack operandstack,stack operatorstack)else if(op == '-')else if(op == '*')else if(op == '/')

}  4.測試**:

public static void main(string args)

使用棧完成算術表示式的計算

需要兩個棧來分別儲存我們的操作符和數字 通過乙個 index 值 索引 來遍歷我們的表示式 如果我們發現是乙個數字,就直接入數棧 如果發現掃瞄到是乙個符號,就分如下情況 3.1 如果發現當前的符號棧為 空,就直接入棧 3.2 如果符號棧有操作符,就進行比較,如果當前的操作符的優先順序小於或者等於棧中...

使用棧完成表示式的計算

使用棧完成表示式的計算思路 1 通過乙個index值,來遍歷我們的表示式 2 如果我們發現是乙個數字,就直接入數棧 3 如果掃瞄到的是乙個符號,就分如下情況 3.1 如果發現當前的符號棧為空,就直接入棧 3.2 如果符號棧有操作符,就進行比較,如果當前的操作符的優先順序小於或者 等於棧中的操作符,就...

使用棧來計算算術表示式

之所以寫這個,是因為最近在學習c 的過程中,c primer 第五版 9.6的習題跟這個有關,在網上看看些人的思路,也就做出來了,正好寫到部落格裡面。原題如下 使用 stack 處理括號化的表示式。當你看到乙個左括號,將其記錄下來。當你在乙個左括號之後看到乙個右括號,從 stack 中 pop 物件...