通過堆疊的學習,我們已經知道想要將中綴表示式轉化成字尾表示式,有以下幾步操作
1.對於運算數:直接輸出
2. 對於左括號:直接壓入棧中
3. 對於右括號:將棧頂的運算子彈出並輸出,若棧頂元素不是左括號,繼續彈出,直到遇到左括號(出棧,但是不輸出)
4. 對於運算子:
• 若優先順序大於棧頂運算子時,則把他壓棧
• 若優先級小於等於棧頂運算子時,將棧頂運算子彈出並輸出:再比較新的棧頂運算子,直到該運算子大於棧頂運算子優先順序為止,然後將該運算子壓棧
5.若各物件處理完畢,則把堆疊中殘留的運算子一併輸出
#include
#include
#include
#include
using
namespace std;
intlevel
(char c)
intmain()
//執行完while之後,s.top = '(',此時需要將棧頂元素彈出,但是不列印
s.pop();
}elseif(
!s.empty()
&&level
(str[i]
)<=
level
(s.top()
))s.
push
(str[i]);
}elseif(
level
(str[i])!=
0)s.
push
(str[i]);
}while
(!s.
empty()
)return0;
}
寫出了第一代**之後發現乙個問題,就是如果數字是多位數,連續輸出多個數字時會連在一起,有沒有辦法讓兩個數字之間有間隔,數字和運算子,運算子與運算子連續呢,那我就想到了增加乙個判斷,最近一次輸出的型別是啥,若為數字,當後一次輸出也為數字時,加個空格,其他情況都不加,於是就有了第二版的**
#include
#include
#include
#include
using
namespace std;
intlevel
(char c)
intmain()
else
if(num !=0)
if(str[i]
>=
'0'&& str[i]
<=
'9')
elseif(
(str[i]
>=
'a'&& str[i]
<=
'z')
||(str[i]
>=
'a'&& str[i]
<=
'z')
)//運算數直接輸出
printf
("%c"
, str[i]);
else
if(str[i]
=='('
) s.
push
(str[i]);
else
if(str[i]
==')'
)//執行完while之後,s.top = '(',此時需要將棧頂元素彈出,但是不列印
s.pop();
type =2;
//最後乙個是運算子,type變成2
}elseif(
!s.empty()
&&level
(str[i]
)<=
level
(s.top()
))s.
push
(str[i]);
type =2;
}elseif(
level
(str[i])!=
0)s.
push
(str[i]);
}if(num !=0)
while
(!s.
empty()
)return0;
}
經過第二版之後,可以說程式已經不錯了,可以實現字母,多位整數的中綴表示式轉化成字尾表示式,那麼如何實現小數成了我下乙個為之努力的目標,我的思路時是找到小數點,小數點前後整合成乙個浮點數,再輸出乙個浮點數,這是我乙個好盆友提醒我,你思維定勢了,你完全可以將『.』當成乙個操作符進行輸出,轉念一想,好有道理,而且實現起來簡單好多,於是就有了第三版
#include
#include
#include
#include
using
namespace std;
intlevel
(char c)
intmain()
else
if(num !=0)
if(str[i]
>=
'0'&& str[i]
<=
'9')
else
if(str[i]
=='.'
)elseif(
(str[i]
>=
'a'&& str[i]
<=
'z')
||(str[i]
>=
'a'&& str[i]
<=
'z')
)//運算數直接輸出
printf
("%c"
, str[i]);
else
if(str[i]
=='('
) s.
push
(str[i]);
else
if(str[i]
==')'
)//執行完while之後,s.top = '(',此時需要將棧頂元素彈出,但是不列印
s.pop();
type =2;
//最後乙個是運算子,type變成2
}elseif(
!s.empty()
&&level
(str[i]
)<=
level
(s.top()
))s.
push
(str[i]);
type =2;
}elseif(
level
(str[i])!=
0)s.
push
(str[i]);
}if(num !=0)
while
(!s.
empty()
)return0;
}
將中綴表示式轉化成字尾表示式
中綴變字尾主要的思想就是將需要的運算子先做乙個對映 對於任意表示式,式中從頭開始掃,遇到非運算子,即任意數字或字母直接輸出 遇到運算子考慮放入棧中 若棧空則放入 若棧不為空,判斷棧頂的優先順序是否 待放入的運算子,若 小於則將其壓入棧中 若不小於,則將棧一直 pop,知道運算子可以放入棧中 當然還有...
將中綴表示式轉化成字尾表示式(逆波蘭式)
直接上 中綴表示式 轉換成 字尾表示式 逆波蘭式 include include struct stack int get priority char c int isempty struct stack s struct stack createstack unsigned int len voi...
將中綴表示式轉化成字尾表示式來計算值
題目很簡單,就是給出乙個表示式 例如2 3 5 6 然後我們得出他的值。未接觸這個方法前,我是用了一種很複雜的方法 爆肝警告 將中綴表示式 就是我們要求的表示式 轉化成字尾表示式來解決就會比較簡單。對於中綴表示式和字尾表示式的概念這裡就不說了,只將方法呈現出來。例如乙個中綴表示式 a b c d e...