1. 程式人生 > >中綴向後綴表示式的轉換

中綴向後綴表示式的轉換

前面也說過,對於計算機來說(不僅僅是計算機)中綴表示式都是複雜的,它要考慮到優先順序的問題,很傷腦筋,至於中綴向後綴的轉換也是一個很傷腦筋的事情,在轉換的過程中要考慮到很多優先順序的情況。

好了,既然跟優先順序有關,那麼我們就應該為各個運算子號設定一個優先順序,我們很明顯對於加減乘除的優先順序已經很明顯能知道怎麼設定,關鍵是擴號這個擁有最高優先順序的符號該怎麼設定優先順序。在考慮這個問題之前我們首先考慮一下沒有括號的中綴表示式怎麼轉換成字尾

首先,設定優先順序:

priority = { "+": 3, "-": 3, "*": 5, "/": 5}

這是我們已知的最簡單設定的優先順序

考慮實現的話,我們建立一個棧用於儲存運算子,列表用於儲存慢慢形成的字尾表示式:

S = Stack()
exp = []
infix_operators = '+-*/'

分析一下中綴怎麼轉換成字尾,對於遇到數字,直接放在後綴表示式的表中就可以了。經過分析,我們應該清楚,每次想加入一個運算子到字尾表示式中時總是要比較一下它與它在中綴表示式後面的一個符號的優先順序大小;如果他的優先順序大於後面一個,直接將他加入到字尾表示式中,如果他的優先順序小於後面一個,我們只有先將它壓到棧中,在待它的下一個運算子加入到字尾表示式中後再講它加入到字尾表示式中
我想以上就是整個轉換過程中的關鍵。

def trans_infix_suffix(line):
    line = line.split(" ")
    st = Stack()
    # 這裡棧用於處理運算子
    exp = []
    # 這裡的列表用於儲存字尾表示式

    for i in line:
        if i not in infix_operators:
            exp.append(i)
            # 遇到數字我們直接加進去就好
        elif st.is_empty():
            st.push(i)
            # 如果棧是空的,那說明它還要比較下一個運算子的優先順序
        else:
            while not st.is_empty():
                if priority[i] > priority[st.top()]:
                    break
                else:
                    exp.append(st.pop())        
            st.push(i)
           # 關鍵在於每次放進去符號之前都要比較一下,它與下一個運算子的優先順序大小
    while not st.is_empty():
        exp.append(st.pop())
    return " ".join(exp)

上面就是轉換一個沒有括號的中綴,下面我們看一下包含括號的。

from 棧的順序表實現 import Stack

priority = { "(": 1, "+": 3, "-": 3, "*": 5, "/": 5}
# 括號設定一個優先順序比較低

infix_operators = "+-*/()"

def trans_infix_suffix(line):
    line = line.split(" ")
    st = Stack()
    # 這裡棧用於處理運算子
    exp = []
    # 這裡的列表用於儲存字尾表示式

    for i in line:
        if i not in infix_operators:
            exp.append(i)
            
        elif st.is_empty() or i == '(':
            st.push(i)
           # 遇到括號我們直接插入就行了
            
        elif i == ")":
            x = st.pop()
            while x != '(':
                exp.append(x)
                x = st.pop()
                
        else:
            while not st.is_empty():
                if priority[i] > priority[st.top()]:
                    break
                else:
                    exp.append(st.pop())        
            st.push(i)
            
    while not st.is_empty():
        exp.append(st.pop())
    return " ".join(exp)

中綴轉換為字尾大概就是這樣,其實裡面的我也講的不是很清楚,大概理解。