棧的應用之算術表示式求值

2021-07-11 12:21:19 字數 2154 閱讀 1075

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 輸入的表示式都是合法的。編...