字尾表示式(也叫做逆波蘭式或逆波蘭記法),其實就是將運算子寫在運算元之後的式子。比如我們平時寫a+b
,這是中綴表示式,寫成字尾表示式就是ab+
。下面來看乙個更複雜的例子:
求(a+b)*c-(a+b)/e
字尾表示式的j具體過程:
(a+b)*c-(a+b)/e
→ ((a+b)*c)((a+b)/e)-
→ ((a+b)c*)((a+b)e/)-
→ (ab+c*)(ab+e/)-
→ ab+c*ab+e/-
生成字尾表示式主要借助了**棧
這一資料結構,具體的實現**如下,其中輸入的是中綴表示式的字串,然後返回字尾表示式**的字串。
def
generate_postfix
(infix)
:"""
generate postfix expression str
:param infix: infix expression str, like '2x3+8/3'
:return: postfix expression str, like '23x83/+'
"""op_rank =
# 定義加減乘除的優先順序
stack =
# 用list模擬棧的後進先出
post_list =
for s in infix:
if s in
'+-x/'
:# operator
# 棧不為空,且棧頂運算子的優先順序高於當前運算子
while stack and op_rank.get(stack[-1
])>= op_rank.get(s)
:# priority))
else
:# operand
while stack:))
return
''.join(post_list)
字尾表示式的計算同樣需要使用到**棧
,具體的實現**如下,其中輸入的是字尾表示式字串,然後返回該表示式int型別的計算結果**。
def
calculate_postfix
(postfix)
:"""
calculate postfix expression
:param postfix: postfix expression str, like '23x83/+'
:return: int result, like 2x3+8/3=6+2=8
"""stack =
# 用list模擬棧的後進先出
for p in postfix:
if p in
'+-x/'
:# operator
value_2 =
int(stack.pop())
# 第二個運算元
value_1 =
int(stack.pop())
# 第乙個運算元
if p ==
'+':
result = value_1 + value_2
elif p ==
'-':
result = value_1 - value_2
elif p ==
'x':
result = value_1 * value_2
else
:# 整除
result = value_1 // value_2
else
:return stack.pop(
)
中綴表示式轉字尾表示式及字尾表示式的計算
這裡舉個栗子手動轉換叭 ps 以下紅色括號皆為新增後的效果!中綴表示式 5 20 1 3 14 按運算子優先順序對所有運算子和它的運算數加括號 原本的括號不用加 5 20 1 3 14 把運算子移到對應的括號後 此處注意括號的變化 5 20 1 3 14 去掉括號 字尾表示式 5 20 1 3 14...
字首 中綴 字尾表示式及中綴轉字尾表示式
字首表示式 不含括號的算術表示式,而且是將運算子寫在前面,運算元寫在後面的表示式。求法 首先從右往左掃瞄表示式,從右邊第乙個字元判斷,如果當前字元是數字,則一直到字串的末尾再記錄下來 如果是運算子,則將右邊最近的兩個數字串做相應的運算,以此作為乙個新串並記錄下來。一直掃瞄到最左端停止。例子 a b ...
中綴表示式轉字尾表示式 python
這是之前資料結構學過的知識,現在忘了複習一下,如果有小夥伴對這方面的知識忘了的話我建議看這篇部落格,講的非常詳細,我這裡主要講一下用 實現的思路 初始乙個存放結果的列表 result和存放操作符的棧op stack 從前往後遍歷中綴表示式,處理一下四種情況 為數字 則直接新增到result後面 為 ...