數據結構 棧的應用 表達式 中序轉後序 infix to postfix(python)

例如:中序表達式(23+3445/(5+6+7)) 轉換成後序表達式 23344556+7+/+
後序表達式用處:

當轉換成後序表達式後更方便計算表達式的值,如將後序表達式的元素依次進棧直到遇到運算符,這時候從棧中彈出兩個元素,再結合運算符計算出這兩個數運算的結果(如34*45=1530),將其結果壓棧(此時棧元素爲23
1530),然後繼續將後序非符號元素壓棧,直到遇到運算符。重複之前的操作。。。

InfixExp(中序表達式)轉換PostfixExp(後序表達式)算法:

1)當輸入的是操作數時候,直接輸出到後序表達式PostfixExp序列中 2)當輸入開括號時候,把它壓棧
3)當輸入的是閉括號時候,先判斷棧是否爲空,若爲空,則發生錯誤並進行相關處理。若非空,把棧中元素依次彈出並輸出到Postfix中,知道遇到第一個開括號,若沒有遇到開括號,也發生錯誤,進行相關處理
4)當輸入是運算符op(+、- 、×、/)時候
a)循環,當(棧非空and棧頂不是開括號and棧頂運算符的優先級不低於輸入的運算符的優先級)時,反覆操作:將棧頂元素彈出並添加到Postfix中
b)把輸入的運算符op壓棧
5)當中序表達式InfixExp的符號序列全部讀入後,若棧內扔有元素,把他們依次彈出並放到後序表達式PostfixExp序列尾部。若彈出的元素遇到空括號,則說明不匹配,發生錯誤,並進行相關處理
參考文獻許卓羣版《數據結構與算法》

根據《圖解數據結構:使用PYTHON 》這本書上的算法,我重新寫了一下代碼,更加的簡介易讀了,個人認爲比書上的代碼好多了。
stack棧類:

class Stack(object):
    # 初始化棧爲空列表
    def __init__(self):
        self.items = []
    # 判斷棧是否爲空,返回布爾值
    def is_empty(self):
        return self.items == []
    # 返回棧頂元素
    def peek(self):
        if len(self.items):
            return self.items[len(self.items) - 1]
        else:
            return None
    # 返回棧的大小
    def size(self):
        return len(self.items)
    # 入棧
    def push(self, item):
        self.items.append(item)
    # 出棧
    def pop(self):
        return self.items.pop()

主體算法部分:

from stack import Stack
def conpare(stack_o,infix_o):
    prec = {}
    prec['q'] = prec[')'] = 1  
    prec['+'] = prec['-'] = 2
    prec['*'] = prec['/'] = 3
    prec['('] = 4
    if prec[')' if stack_o=='(' else stack_o] >= prec[infix_o]:
        return 1
    else:
        return 0
def infix_to_postfix(str_):
    stack_t = Stack()
    stack_t.push('q')
    operators = ['+', '-', '*', '/', '(']
    #str_ = input('請輸入表達式:')+ 'q'
    str_ =  str_ + 'q'
    for i in range(len(str_)):
        if str_[i] in operators:
            while conpare(stack_t.peek(),str_[i]) ==1 :
                print(stack_t.pop(),end='')
            stack_t.push(str_[i])
        elif str_[i] == ')':
            while stack_t.peek() != '(':
                print(stack_t.pop(), end='')
            stack_t.pop()
        elif str_[i] == 'q':
            while stack_t.peek() != 'q':
                print(stack_t.pop(), end='')
        else:
            print(str_[i],end='')

《圖解數據結構:使用PYTHON 》這本書上寫的代碼,很長,很長。。

下面是它的代碼,我還修改優化了一點。它原理用了棧,但實際上卻用了list,導致代碼有點臃腫。。。難理解

MAX = 50
infix =[None] * MAX
def conpare(stack_o,infix_o):
    index_s = index_i =0
    infix_priority=['q',')','+','-','*','/','','','(',]
    stack_priority=['q','(','+','-','*','/']
    while stack_priority[index_s] != stack_o:
        index_s +=1
    while infix_priority[index_i] != infix_o:
        index_i +=1
    if index_s//2 >= index_i//2:
        return 1
    else:
        return 0
def infix_to_postfix(str_):
    global  MAX
    global infix
    index = 0
    stack = [None]*20
    top = 0
    stack[top]  = 'q'
    while index <len(str_):
        infix[index] = str_[index]
        index += 1
    infix[index] = 'q'
    #print(infix)
    operators =['+','-','*','/','(']
    for i in range(index+1):
        if infix[i]==')':
            while stack[top] != '(':
                print(stack[top],end='')
                top -= 1
            top -=1
        elif infix[i] in operators:
            while conpare(stack[top],infix[i]) == 1:
                print(stack[top],end='')
                top -= 1
            top += 1
            stack[top] = infix[i]
        elif infix[i] == 'q':
            while stack[top] != 'q':
                print(stack[top],end='')
                top -=1
        else:
            print(infix[i],end='')

註釋什麼的,以後再寫吧。。。因爲我懶。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章