新聞中心
這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)Python教程:用Python舉例實現(xiàn)逆波蘭表達(dá)式
逆波蘭表達(dá)式是編譯原理中的一種基本表達(dá)式,利用python語言也可以實現(xiàn)逆波蘭表達(dá)式的輸出,這里舉例實踐說明:

創(chuàng)新互聯(lián)建站堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的伊犁網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
什么是逆波蘭表達(dá)式?
逆波蘭表達(dá)式又叫做后綴表達(dá)式。在通常的表達(dá)式中,二元運算符總是置于與之相關(guān)的兩個運算對象之間,所以,這種表示法也稱為中綴表示。波蘭邏輯學(xué)家J.Lukasiewicz于1929年提出了另一種表示表達(dá)式的方法。按此方法,每一運算符都置于其運算對象之后,故稱為后綴表示。
舉例實現(xiàn):
# -*- coding: utf-8 -*-
symbol_priority = {}
symbol_priority[0] = ['#']
symbol_priority[1] = ['(']
symbol_priority[2] = ['+', '-']
symbol_priority[3] = ['*', '/']
symbol_priority[4] = [')']
def comparePriority(symbol, RPN_stack, symbol_stack):
'''Compare priority between two symbols'''
global symbol_priority
if len(symbol_stack) > 0:
symbol_pop = symbol_stack.pop()
else:
return
for list in symbol_priority.values():
if (symbol in list) and (symbol_pop in list):
'''same priority'''
symbol_stack.append(symbol_pop)
symbol_stack.append(symbol)
return
elif symbol in list:
'''symbol is smaller'''
RPN_stack.append(symbol_pop)
#recusion call
comparePriority(symbol, RPN_stack, symbol_stack)
return
elif symbol_pop in list:
'''symbol is bigger'''
symbol_stack.append(symbol_pop)
symbol_stack.append(symbol)
return
else:
continue
symbol_stack.append(symbol_pop)
return
def scanEveryone(input_string, RPN_stack, symbol_stack):
for ch in input_string:
if ch.isdigit():
RPN_stack.append(ch)
else:
if len(symbol_stack) > 0:
if ch == '(':
symbol_stack.append(ch)
elif ch == ')':
while True:
symbol_pop = symbol_stack.pop()
if symbol_pop == '(':
break
else:
RPN_stack.append(symbol_pop)
else:
comparePriority(ch, RPN_stack, symbol_stack)
else:
symbol_stack.append(ch)
def scanInput(RPN_stack, symbol_stack):
input_string = raw_input()
input_string += '#'
scanEveryone(input_string, RPN_stack, symbol_stack)
def calRPN(RPN_stack):
value_stack = []
RPN_stack.append('#')
for value in RPN_stack:
if value == '#':
return value_stack.pop()
break
if value.isdigit():
value_stack.append(value)
else:
right_value = value_stack.pop()
left_value = value_stack.pop()
cal_string = left_value + value + right_value
value_stack.append(str(eval(cal_string)))
def main():
RPN_stack = []
symbol_stack = []
scanInput(RPN_stack, symbol_stack)
print calRPN(RPN_stack)
if __name__ == '__main__':
main()calRPN.py
# -*- coding: utf-8 -*-
symbol_priority = {}
symbol_priority[0] = ['#']
symbol_priority[1] = ['(']
symbol_priority[2] = ['+', '-']
symbol_priority[3] = ['*', '/']
symbol_priority[4] = [')']
def comparePriority(symbol, RPN_stack, symbol_stack):
'''Compare priority between two symbols'''
global symbol_priority
if len(symbol_stack) > 0:
symbol_pop = symbol_stack.pop()
else:
return
for list in symbol_priority.values():
if (symbol in list) and (symbol_pop in list):
'''same priority'''
symbol_stack.append(symbol_pop)
symbol_stack.append(symbol)
return
elif symbol in list:
'''symbol is smaller'''
RPN_stack.append(symbol_pop)
#recusion call
comparePriority(symbol, RPN_stack, symbol_stack)
return
elif symbol_pop in list:
'''symbol is bigger'''
symbol_stack.append(symbol_pop)
symbol_stack.append(symbol)
return
else:
continue
symbol_stack.append(symbol_pop)
return
def scanEveryone(input_string, RPN_stack, symbol_stack):
for ch in input_string:
if ch.isdigit():
RPN_stack.append(ch)
else:
if len(symbol_stack) > 0:
if ch == '(':
symbol_stack.append(ch)
elif ch == ')':
while True:
symbol_pop = symbol_stack.pop()
if symbol_pop == '(':
break
else:
RPN_stack.append(symbol_pop)
else:
comparePriority(ch, RPN_stack, symbol_stack)
else:
symbol_stack.append(ch)
def scanInput(RPN_stack, symbol_stack):
input_string = raw_input()
input_string += '#'
scanEveryone(input_string, RPN_stack, symbol_stack)
def calRPN(RPN_stack):
value_stack = []
RPN_stack.append('#')
for value in RPN_stack:
if value == '#':
return value_stack.pop()
break
if value.isdigit():
value_stack.append(value)
else:
right_value = value_stack.pop()
left_value = value_stack.pop()
cal_string = left_value + value + right_value
value_stack.append(str(eval(cal_string)))
def main():
RPN_stack = []
symbol_stack = []
scanInput(RPN_stack, symbol_stack)
print calRPN(RPN_stack)
if __name__ == '__main__':
main() 文章題目:創(chuàng)新互聯(lián)Python教程:用Python舉例實現(xiàn)逆波蘭表達(dá)式
網(wǎng)站路徑:http://m.jiaoqi3.com/article/djghoog.html


咨詢
建站咨詢
