在程式設計的世界中資料結構和演算法總是形影不離, 難捨難分的.棧作為一種常見的資料結構(抽象資料型別)在程式的世界中有非常的意義.
在電腦科學中,棧是一種抽象資料型別(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...