中綴表達式轉換爲後綴表達式(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模擬一下,我本身的棧代碼實現你能夠參考用鏈表實現棧

擴展閱讀:
中綴表達式轉換爲前綴表達式
相關文章
相關標籤/搜索