通過棧實現中綴表示式到字尾表示式的轉換

2021-09-17 06:02:03 字數 2529 閱讀 3260

在程式設計的世界中資料結構和演算法總是形影不離, 難捨難分的.

棧作為一種常見的資料結構(抽象資料型別)在程式的世界中有非常的意義.

在電腦科學中,棧是一種抽象資料型別(adt / abstract data type),用作資料的集合表示.棧有兩個主要的操作

簡單來說,棧就是乙個**先出(lifo / last in first out)的佇列.現實生活中疊盤子就是乙個形象的棧,新盤子只能在頂部堆疊進去,而抽盤子是從頂部乙個個抽走.

棧在計算機中有非常廣泛的應用,比如說函式的呼叫堆疊.談點更實在的應用的話,棧可以非常方便的用來做平衡符號, 表示式求值和語法解析.

今天的重點是通過棧實現乙個中綴表示式到字尾表示式的轉換,為之後的構建表示式樹做鋪墊.

使用棧來實現平衡符號其實非常簡單

常見的表示式如a + b * c + g / f在計算這個表示式時,我們必須明確記住操作符的優先順序,+, -的優先順序小於*, /所以表示式處理上就會比較複雜.如果我們換種思路,將中綴表示式轉換為字尾表示式,那處理就會簡單很多.

這種記法其實就是將我們口頭上的說法搬到紙上.

最後展開的結果就是中綴表示式a + b * c + g / f轉換成字尾表示式的結果a b c * + g f / +,這種記法叫做字尾記法或者逆波蘭記法.

計算這個表示式的值的簡單方法就是使用棧.

那麼問題來了,如何將中綴表示式轉換成字尾表示式呢?

顯然,我們也可以通過棧來進行轉換.記住以下幾個規則

規則就這麼多,是不是感覺很難理解?我們來看個栗子~

#include #include #include #include #include // 用於判斷字元型別

int sp = -1; // 棧頂指標, 始終指向棧頂, 空棧時指向棧底(0)之下

char symbol_stack[64] = ; // 顯然,我們需要個符號棧來存放操作符

// 定義幾個棧操作

void push(char op); // 將符號 op 推入棧中

char pop(void); // 彈出棧頂元素

char top(void); // 檢視棧頂的元素

int main(void)

// 如果不是運算元,並且不是 '+', '-', '*', '/', '(', ')', ' ' 那就報錯

if (current_character != '+' && current_character != '-' &&

current_character != '*' && current_character != '/' &&

current_character != '(' && current_character != ')' &&

current_character != ' ')

// 跳過空格和結束標誌

if (current_character == ' ' || current_character == '\0')

switch (current_character)

pop(); // 彈出多餘的 (

break;

case '*':

case '/':

// 除了 '(' ')' 之外, * / 具有最高的優先順序, 除非棧中不可能有比 * / 更大的優先順序

// 所以只能彈出優先順序相等的操作符(本身)

while (stack_top_character == '*' || stack_top_character == '/')

// 執行完之後壓入當前的符號

push(current_character);

break;

case '+':

case '-':

// + - 具有最低的優先順序, 所以彈出所有的操作符,除非是代表新棧的 (

while (stack_top_character != '(' && stack_top_character != '\0')

// 執行完之後壓入當前的符號

push(current_character);

break;}}

// 最後執行清空所有棧

while (top() != '\0')

return 0;

}// 入棧操作定義

void push(char op)

// 出棧操作定義

char pop(void)

// 檢視操作定義

char top(void)

看我**是不是感覺就一目了然了呢?如果還是不懂的話,那是我的鍋-^-(面壁思過).其實自己再紙上演算一下就好啦~

接下來就是使用轉換出的字尾表示式構建表示式樹了,其實也是用棧的方式啦~

字尾表示式 中綴到字尾表示式

輸入空格跳出迴圈 while k getchar n 字尾表示式 此 僅限於0 9內的加減乘除 include include include define long 10 using namespace std typedef struct stack qstack void init qstac...

棧 中綴 字尾表示式

利用棧計算字尾表示式 include include include using namespace std int main s.push num i cout i else if str i str i str i str i s.push res cout result 0 利用棧,把中綴表示...

中綴表示式轉為字尾表示式 棧

題目 給乙個中綴表示式 即標準形式的表示式 列印該表示式的字尾表示式。中綴表示式最大的不同就是去掉了表示運算子優先順序的括號。運算元為26個小寫或大寫的英文本母 注意不包括數字和其他字元 操作符為 一共八個。具體見例子見下圖 如下 include include include using name...