表示式計算對於我們人來說,喜歡通過中綴表示式來計算,而計算機則不一樣,需要通過字尾表示式來計算,首先通過例項來介紹一下中綴表示式和字尾表示式
例子
中綴表示式:3*(5+2)-3 *6
字尾表示式:3 5 2 + * 3 6 *-
那麼轉換規則是怎麼樣的呢?
規則:從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即成為字尾表示式的一部分;若是符號,則判斷其與棧頂符號的優先順序,是右括號或優先順序低於棧頂符號(乘除優先加減)則棧頂元素依次出棧並輸出,並將當前符號進棧,一直到最終輸出字尾表示式為止。
進行表示式計算演算法的實現則需要兩個棧。儲存數字的棧,儲存字元的棧。
通過規則將表示式中的數字和字元分別存入兩個棧中,如果儲存在字元棧中的運算子被輸出,則數字棧頂兩個數字進行被輸出運算子的運算(棧頂第乙個數對棧頂第二個數進行操作)並將結果存入數字棧中。直到字元遍歷完成,且運算子棧為空。
#include
#include
#include
#include
using
namespace
std;
stack
stack_ch;//符號棧
stack
stack_num; //數值棧
char str[1000]; //輸入的中綴表示式
char number[100]; //用來將字串中的數字變成int型的陣列
void js1()//這個函式只接收+-號,+-號等級最低,運算子棧中除了括號外 都可以取出運算
stack_num.push(num2);//將計算結果入數值棧
stack_ch.pop();//刪除已經用過的符號
}}void js2()//只接收 / *運算子
stack_ch.pop();
stack_num.push(num2);
}}int main()
number[k]='\0'; //變成字串\0結尾
if (number[0]!='\0')
k=0;
switch(str[i])//『+-(』這3個符號入js1函式,入js2函式 ,優先順序不同要分開計算}}
printf("%d\n",stack_num.top());
return
0;}
表示式計算
棧的應用舉例 棧在表示式計算過程中的應用 建立運算元棧和運算子棧。運算子有優先順序。規則 自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。當遇到運算子時,如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂的連續兩個運算元進行運算,並將結果存入運算元棧,然後繼續...
表示式計算
表示式計算 時間限制 1.0s 記憶體限制 256.0mb 問題描述 輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式 輸入一行,包含乙個表示式。輸出格式 輸出這個表示式的值。樣例輸入 1 2 3 4 5 樣例輸出 4資料規模和約定 表示式長度不超過100,表示式運算...
表示式計算
問題描述 輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式 輸入一行,包含乙個表示式。輸出格式 輸出這個表示式的值。樣例輸入 1 2 3 4 5 樣例輸出 4資料規模和約定 表示式長度不超過100,表示式運算合法且運算過程都在int內進行。include includ...