python實現逆波蘭計算運算式執行個體詳解

來源:互聯網
上載者:User
本文執行個體講述了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程式設計有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.