中綴表示式轉換為后綴表達式
需要一個存放操作符的棧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 = {'*': 2, '/': 2, '%': 2, '+': 1, '-': 1, '(': 0, ')': 0}
for e in expression:
if e == '(':
op_stack.push(e)
elif e == ')':
while op_stack.first() != '(':
output.append(op_stack.pop())
op_stack.pop()
elif e.isdigit():
output.append(e)
else:
while not op_stack.is_empty() and op_priority[op_stack.first()] >= op_priority[e]:
output.append(op_stack.pop())
op_stack.push(e)
while not op_stack.is_empty():
output.append(op_stack.pop())
return ''.join(output)
def postfix_eval(expression):
num_stack = LinkedStack()
for e in expression:
if e.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模擬一下,我自己的棧代碼實現你可以參考用鏈表實現棧
擴展閱讀:
中綴表達式轉換為前綴表達式