国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python實現逆波蘭計算表達式實例詳解

2019-11-25 17:32:20
字體:
來源:轉載
供稿:網友

本文實例講述了python實現逆波蘭計算表達式的方法。分享給大家供大家參考。具體分析如下:

逆波蘭表達式又叫做后綴表達式。在通常的表達式中,二元運算符總是置于與之相關的兩個運算對象之間,所以,這種表示法也稱為中綴表示。波蘭邏輯學家J.Lukasiewicz于1929年提出了另一種表示表達式的方法。按此方法,每一運算符都置于其運算對象之后,故稱為后綴表示。

# -*- 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)    returndef 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)    returndef 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()

希望本文所述對大家的Python程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 隆回县| 囊谦县| 霍城县| 辰溪县| 庆云县| 城口县| 敦化市| 大理市| 台湾省| 宝兴县| 荣昌县| 赣州市| 盐边县| 潞城市| 缙云县| 岳普湖县| 图木舒克市| 永顺县| 安义县| 东光县| 美姑县| 麟游县| 穆棱市| 宁远县| 孟州市| 灵璧县| 子洲县| 合阳县| 长沙市| 绥阳县| 阳朔县| 金乡县| 平和县| 承德县| 余庆县| 连南| 金川县| 周宁县| 栖霞市| 盈江县| 余庆县|