中綴表示式轉換為字尾表示式(python實現)

2022-08-03 18:54:21 字數 1751 閱讀 8985

中綴表示式轉換為字尾表示式需要乙個存放操作符的棧op_stack,輸出結果的列表output

步驟:從左到右遍歷表示式:

1. 若是數字,直接加入到output

2. 若是操作符,比較該操作符和op_stack中操作符的優先順序,若優先順序大於op_stack中的,則壓入到op_stack中

否則,將op_stack中優先順序大於或等於該操作符優先順序的所有操作符加入到output中,然後壓入op_stack中

3. 若是左括號,壓入到op_stack中

4. 若是右括號,將op_stack中所有左括號前面的操作符加入到output中

重複上面的步驟字尾表示式求值需要乙個存放中間結果的棧num_stack

步驟:從左到右遍歷表示式:

1. 若是數字,壓入到num_stack中

2. 若是操作符,取出num_stack中的前兩個元素,第二個是表示式左邊的運算元,計算表示式的值,將求值結果壓入到num_stack中

python**實現

from

linked_stack import linkedstack

def infix2postfix(expression):

output =

op_stack =linkedstack()

op_priority =

for e in

expression:

if e == '('

: op_stack.push(e)

elif e == ')'

:

while op_stack.first() != '('

: op_stack.pop()

elif e.isdigit():

else

:

while not op_stack.is_empty() and op_priority[op_stack.first()] >=op_priority[e]:

op_stack.push(e)

while

not op_stack.is_empty():

return

''.join(output)

def postfix_eval(expression):

num_stack =linkedstack()

for e in

expression:

ife.isdigit():

num_stack.push(e)

else

: num1 =num_stack.pop()

num2 =num_stack.pop()

res = eval(num2 + e +num1)

num_stack.push(str(res))

return

num_stack.pop()

if __name__ == "

__main__":

print(infix2postfix(

'2+(3+5)*(6+4)*(8+3)'))

print(postfix_eval(

'235+64+*83+*+

'))

**中的棧是我自己實現的,你可以用list模擬一下,我自己的棧**實現你可以參考用鍊錶實現棧

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

今天我們課前談一談,要說點什麼好呢?最近小甲魚發現,很多魚油在學習資料結構和演算法的時候積極性已經開始有點下降了。甚至很多朋友懷疑資料結構和演算法到底有沒有用?實話說,在大廈的防震設計 消除疾病 防止水源枯竭這些實際問題中,很遺憾,資料結構和演算法幾乎起不到任何直接作用。那為什麼我們要學呢?很簡單,...

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

字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...

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

字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...