1. 程式人生 > >python-中綴轉換後綴並計算

python-中綴轉換後綴並計算

erro odin elif 簡單 列表 運算符號 brush __init__ 但是

這個好像比較簡單。

前綴規則好像還沒有理清楚。

# coding = utf-8


class Stack:
    def __init__(self):
        self.items = []

    # 是否為空
    def is_empty(self):
        return self.items == []

    # 進棧
    def push(self, item):
        self.items.append(item)

    # 出棧
    def pop(self):
        return self.items.pop()

    # 返回棧頂值,不改變棧
    def peek(self):
        return self.items[len(self.items) - 1]

    # 返回棧長度
    def size(self):
        return len(self.items)


def infix_to_postfix(infix_expr):
    prec = dict()
    prec["*"] = 3
    prec["/"] = 3
    prec["+"] = 2
    prec["-"] = 2
    prec["("] = 1
    prec[")"] = 1
    postfix_expr = []
    s = Stack()
    for item in infix_expr.split():
        # 如果標記是操作數,將其附加到輸出列表的末尾
        if item not in prec.keys():
            postfix_expr.append(item)
        # 如果標記是左括號,將其壓到 s 上
        elif item == ‘(‘:
            s.push(item)
        # 如果標記是右括號,則彈出 s,直到刪除相應的左括號。將每個運算符附加到
        # 輸出列表的末尾
        elif item == ‘)‘:
            while s.peek() != ‘(‘:
                postfix_expr.append(s.pop())
            s.pop()
        # 如果標記是運算符, *,/,+  或  -  ,將其壓入 s。但是,首先刪除已經在
        # s 中具有更高或相等優先級的任何運算符,並將它們加到輸出列表中
        else:
            while (not s.is_empty())                     and (prec[s.peek()] >= prec[item]):
                postfix_expr.append(s.pop())
            s.push(item)
        print(s.items)
    # 當輸入表達式被完全處理時,檢查 s。仍然在棧上的任何運算符都可以刪除並加到
    # 輸出列表的末尾
    while not s.is_empty():
        postfix_expr.append(s.pop())

    return ‘ ‘.join(postfix_expr)


def postfix_eval(postfix_expr):
    s = Stack()
    for item in postfix_expr.split():
        # 如果不是運算符號,壓棧
        if item not in ‘+-*/‘:
            s.push(item)
        else:
            # 如果是運算符號,取出棧上最近兩個數字進行運算
            # 然後,再將結果壓回棧
            op2 = int(s.pop())
            op1 = int(s.pop())
            print(op1, item, op2)
            result = do_match(item, op1, op2)
            s.push(result)
        print(s.items)
    return result


# 運行結果
def do_match(op, op1, op2):
    if op == ‘+‘:
        return op1 + op2
    elif op == ‘-‘:
        return op1 - op2
    elif op == ‘*‘:
        return op1 * op2
    elif op == ‘/‘:
        return op1 / op2
    else:
        raise Exception(‘Error operation!‘)


infix_str = ‘( 23 + 2 ) * 5 - 280 / ( 4 + 11 * 6 - 35 )‘

postfix_output = infix_to_postfix(infix_str)
print(infix_str)
print(postfix_output)
postfix_result = postfix_eval(postfix_output)
print(postfix_result)

  

輸出:顯示了棧的情況

C:\Users\Sahara\.virtualenvs\untitled\Scripts\python.exe D:/test/python_stack.py
[‘(‘]
[‘(‘]
[‘(‘, ‘+‘]
[‘(‘, ‘+‘]
[]
[‘*‘]
[‘*‘]
[‘-‘]
[‘-‘]
[‘-‘, ‘/‘]
[‘-‘, ‘/‘, ‘(‘]
[‘-‘, ‘/‘, ‘(‘]
[‘-‘, ‘/‘, ‘(‘, ‘+‘]
[‘-‘, ‘/‘, ‘(‘, ‘+‘]
[‘-‘, ‘/‘, ‘(‘, ‘+‘, ‘*‘]
[‘-‘, ‘/‘, ‘(‘, ‘+‘, ‘*‘]
[‘-‘, ‘/‘, ‘(‘, ‘-‘]
[‘-‘, ‘/‘, ‘(‘, ‘-‘]
[‘-‘, ‘/‘]
( 23 + 2 ) * 5 - 280 / ( 4 + 11 * 6 - 35 )
23 2 + 5 * 280 4 11 6 * + 35 - / -
[‘23‘]
[‘23‘, ‘2‘]
23 + 2
[25]
[25, ‘5‘]
25 * 5
[125]
[125, ‘280‘]
[125, ‘280‘, ‘4‘]
[125, ‘280‘, ‘4‘, ‘11‘]
[125, ‘280‘, ‘4‘, ‘11‘, ‘6‘]
11 * 6
[125, ‘280‘, ‘4‘, 66]
4 + 66
[125, ‘280‘, 70]
[125, ‘280‘, 70, ‘35‘]
70 - 35
[125, ‘280‘, 35]
280 / 35
[125, 8.0]
125 - 8
[117]
117

  

python-中綴轉換後綴並計算