香港云主机最佳企业级服务商!

ADSL拨号VPS包含了中国大陆(联通,移动,电信,)

中国香港,国外拨号VPS。

当前位置:云主机 > python >

电信ADSL拨号VPS
联通ADSL拨号VPS
移动ADSL拨号VPS

python实现逆波兰计算表达式实例详解


时间:2021-11-29 16:25 作者:admin


本文实例讲述了python/' target='_blank'>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程序设计有所帮助。

(责任编辑:admin)






帮助中心
会员注册
找回密码
新闻中心
快捷通道
域名登录面板
虚机登录面板
云主机登录面板
关于我们
关于我们
联系我们
联系方式

售前咨询:17830004266(重庆移动)

企业QQ:383546523

《中华人民共和国工业和信息化部》 编号:ICP备00012341号

Copyright © 2002 -2018 香港云主机 版权所有
声明:香港云主机品牌标志、品牌吉祥物均已注册商标,版权所有,窃用必究

云官方微信

在线客服

  • 企业QQ: 点击这里给我发消息
  • 技术支持:383546523

  • 公司总台电话:17830004266(重庆移动)
  • 售前咨询热线:17830004266(重庆移动)