1 + 2 * (3 + 4)
此算術表示式由一些操作符和運算元組成。其中,操作符有『+』、『*』、『(』等,運算元有『1』、『2』、『3』等。對於操作符來說,其運算是有優先順序的。比如,上述表示式中,3+4應該先進行操作,將得到的結果再與2相乘。
算符間的優先關係如下:
運算子+-*
/()#
+>
>
<
<
<
>
>
->
>
<
<
<
>
>
*>
>
>
>
<
>
>
/>
>
>
>
<
>
>
(<
<
<
<
<=)
>
>
>
>
>
>
#>
>
<
<
<=
根據算符間的優先關係表,使用兩個棧。乙個棧為optr,儲存運算子,另乙個棧opnd,儲存運算數。
程式執行過程如下:
初始化,將兩個棧均置為空。將『#』提前入optr棧。
讀取表示式的每個字元。若讀取內容為運算數,則將其轉換為整數後加入opnd棧。若讀取內容為運算子,則比較所讀運算子和棧頂運算子的優先順序大小,做以下處理:
若棧頂運算子優先順序比較低,則將讀取的運算子入optr棧,繼續讀取表示式的下一字元;
若兩個運算子優先順序相等,則棧頂運算子直接出棧,繼續讀取表示式的下一字元;
若棧頂運算子優先順序比較高,則棧頂運算子出棧,同時,opnd棧出兩個元素,將運算後的結果放入opnd棧中。
最後,opnd棧中只剩乙個元素,即為表示式的值。
**如下:
#include
#include
using
namespace
std;
stack
opnd; //運算元
stack
optr; //操作符
int priority[7][7] = ; //儲存優先順序關係
void initial(); //初始化
void getexpressionvalue(); //計算表示式的值
int getpriority(char a, char b); //得到a,b優先順序
int operate(int a, char theta, int b); //計算a theta b的值
int main()
void initial()
while(!optr.empty())
optr.push('#');
}void getexpressionvalue()
; //運算元
int d = 0;
char ch;
char theta;
int a = 0;
int b = 0;
int i = 0;
int j = 0;
cin >> ch;
while(ch != '#' || optr.top() != '#') //兩個都=『#』,求值結束
for(j = 0; j < i; j++)
opnd.push(d); //運算元入棧
}else
//ch是操作符
case
0: //相等,消去括號
case
1: //棧頂的操作符優先順序大於當前操作符
default:
break;}}
}}int getpriority(char a, char b)
switch(b)
if(i >= 0 && j >= 0)
else
}int operate(int a, char theta, int b)
return res;
}
棧的應用 算術表示式求值
選擇棧作為資料結構,所以所有操作都要圍繞棧的特點來進行。因為先入棧而被壓在下面的意味著要後處理,所以優先順序低的不能壓著優先順序高的而入棧。對於同級的操作符,因為要按照從左往右的運算規則,所以也不 能壓著同級的操作符而入棧。簡單來說,與棧頂的操作符比較,優先順序高的則入棧,否則操作符出棧作相應運 算...
算術表示式求值 棧的應用
注 實驗用書為 資料結構 c語言版 第2版,人民郵電出版社出版。實驗題目 學生管理系統的設計與實現 實驗環境 visual c 6.0或其他c 環境 一 實驗目的 1 掌握棧的定義及實現 2 掌握利用棧求解算術表示式的方法。二 實驗內容 通過修改完善教材中的演算法3.4,利用棧來實現算術表示式求值的...
棧的應用 算術表示式求值
算術表示式中可以包含 這6個運算子,要計算的表示式以字串行的形式在程式執行時輸入。為了便於實現,規定 1 每個表示式均以字元 開始,以 號結束,例如,23 13 8 76 100 表示式中不能出現數字和運算子外的其它字元 空格也不行 2 表示式中的運算數只能是非負整數 3 輸入的表示式都是合法的。編...