Python生成字尾表示式及計算

2021-09-26 19:57:34 字數 1936 閱讀 4999

字尾表示式(也叫做逆波蘭式或逆波蘭記法),其實就是將運算子寫在運算元之後的式子。比如我們平時寫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後面 為 ...