中綴表達式轉換為后綴表達式(python實現)


中綴表示式轉換為后綴表達式

需要一個存放操作符的棧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模擬一下,我自己的棧代碼實現你可以參考用鏈表實現棧

擴展閱讀:
中綴表達式轉換為前綴表達式
 
        




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM