棧的應用 表示式運算

2021-08-31 00:02:10 字數 2565 閱讀 1314

字首表示式:又稱波蘭表示法(polish notation,或波蘭記法),是一種邏輯、算術和代數表示方法,其特點是操作符置於運算元的前面,因此也稱做字首表示法。

中綴表示式:通常將運算子寫在運算量之間,例如a+b,這種表示法稱為中綴表示法。

字尾表示式:字尾表示法又稱逆波蘭表示法,它是波蘭邏輯學家盧卡西維奇發明的一種表示表示式的方法。這種表示法把運算量寫在前面,把運算子寫在後面(字尾),例如a+b寫作ab+,a+b*c寫作abc*+,(a+b)*c寫作ab+c*等等。

計算機沒法計算帶有括號,以及區分優先順序的表示式,或者說很難計算。使用字尾,字首,消除了括號和優先順序。

轉化為字尾:從左到右遍歷中綴表示式,遇到運算元,輸出,遇到操作符,當前操作符的優先順序大於棧頂操作符優先順序,進棧,否則,彈出棧頂優先順序大於等於當前操作符的操作符,當前操作符進棧。

轉化為字首:從右到左遍歷中綴表示式,遇到運算元,輸出,遇到操作符,當前操作符的優先順序大於等於棧頂操作符優先順序,進棧,否則,彈出棧頂優先順序大於當前操作符的操作符,當前操作符進棧。

在逆波蘭式的實現中,最大的問題是如何改變運算子的先後順序,把高優先順序的運算子放在低優先順序運算子的左側。比如,有乙個中綴表示式2 + 3 × 4,它所對應的逆波蘭式應當是2 3 4 × +。

在我們做中綴表示式到逆波蘭式轉換的時候,必須在不改變運算元順序的情況下,把高優先順序的乘法操作符移動到低優先順序的加法運算子的左側。

很自然的,我們會想到堆疊。堆疊具有後進先出的特點。所以我們可以設計乙個符號棧,用於臨時儲存乙個中綴表示式中的全部運算子;設計乙個rpn陣列,用於儲存逆波蘭式輸出。然後從左向右掃瞄乙個中綴表示式,並迴圈執行以下步驟:

如果掃瞄到乙個運算數,則將其放到rpn陣列的末尾

如果掃瞄到乙個運算子。首先比較該運算子和符號棧棧頂運算子的優先順序。如果符號棧棧頂運算子的優先順序比較低,則將新運算子壓入符號棧(這樣最後將符號出棧時,高優先順序符號先出棧)。如果棧頂符號的優先順序更高,就把棧頂符號彈出,並放入rpn陣列末尾。然後繼續比較新掃瞄到的運算子和棧頂運算子的優先順序,直到找到乙個優先順序比自己低的棧頂元素或者到達堆疊棧底。

如果表示式掃瞄結束。將棧中操作符順序彈出放到rpn陣列中。這樣就得到了乙個逆波蘭表示式。

如下是乙個逆波蘭式生成過程的例項。其中綠色部分代表每一步中發生變化的部分。其中特殊之處在於對括弧的處理,括弧的優先順序高於所有操作符,但是括弧中所有的操作符優先順序又高於括弧。所以當棧頂為括弧的時候,不會將括弧彈出,而是繼續壓棧。當彈出括弧的時候,也不會把括弧放入逆波蘭式中。

原中綴表示式:3 + 4 × (5 - 2)/ 2

逆波蘭表示式:3 4 5 2 - × 2 / +

計算字尾:從左到右遍歷字尾表示式,遇到運算元,放進棧,遇到操作符,棧頂兩個數出棧,進行運算,運算結果放進棧,直到讀完字尾表示式。

計算字首:從左到右遍歷字首表示式,遇到操作符,放進棧,遇到運算元,檢視棧頂,棧頂為操作符,放進棧,棧頂為運算元,取出棧頂運算元和操作符,進行運算,運算後繼續判斷棧頂的情況。

while有輸入符號

讀入下乙個符號

if是乙個運算元

入棧else if是乙個操作符

有乙個先驗的**給出該操作符需要n個引數

if堆疊中少於n個運算元

(錯誤) 使用者沒有輸入足夠的運算元

else n個運算元出棧

計算操作符。

將計算所得的值入棧

if棧內只有乙個值

這個值就是整個計算式的結果

else多於乙個值

(錯誤) 使用者輸入了多餘的運算元

中綴表示式 「5 + ((1 + 2) * 4) − 3」 寫作字尾表示式  5 1 2 + 4 * + 3 −

下表給出了該逆波蘭表示式從左至右求值的過程,堆疊欄給出了中間值,用於跟蹤演算法。

輸入操作

堆疊注釋5入棧

51入棧5, 12入棧

5, 1, 2

+加法運算

5, 3

(1, 2)出棧;將結果(3)入棧4入棧

5, 3, 4

*乘法運算

5, 12

(3, 4)出棧;將結果(12)入棧

+加法運算

17(5, 12)出棧;將結果 (17)入棧3入棧

17, 3

−減法運算

14(17, 3)出棧;將結果(14)入棧

計算完成時,棧內只有乙個運算元,這就是表示式的結果:14

鏈棧的應用 表示式運算

鏈棧的應用 表示式運算 include include using namespace std define selemtype int typedef struct linknode linkstack 判空函式 鏈棧為空返回1 不為空返回0 intisempty linkstack top 初始...

棧應用 表示式求值

include stdafx.h include using namespace std const int explenght 20 const int stack init size 20 const int stack incrment 10 templateclass stack stack...

棧應用 表示式求值

include include define length 100 初始分配棧的長度 define add len 10 棧長增量 typedef struct 定義字元棧 sqstack void initstack sqstack s 初始化乙個棧 void push sqstack s,int...