例如:中序表達式(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='')
註釋什麼的,以後再寫吧。。。因爲我懶。。