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

首頁(yè) > 編程 > Python > 正文

python實(shí)現(xiàn)逆波蘭計(jì)算表達(dá)式實(shí)例詳解

2020-02-23 01:05:36
字體:
供稿:網(wǎng)友

本文實(shí)例講述了python實(shí)現(xiàn)逆波蘭計(jì)算表達(dá)式的方法。分享給大家供大家參考。具體分析如下:

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

# -*- 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()            
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 娱乐| 临泽县| 秦安县| 延吉市| 桑植县| 江西省| 渭南市| 友谊县| 重庆市| 健康| 定兴县| 濉溪县| 江山市| 佳木斯市| 平和县| 五大连池市| 安远县| 赤峰市| 拉萨市| 白银市| 巴东县| 屏东市| 枝江市| 都匀市| 娱乐| 克东县| 临沭县| 郑州市| 葫芦岛市| 龙泉市| 子长县| 黄冈市| 滨州市| 金溪县| 海淀区| 博乐市| 平阳县| 烟台市| 荔浦县| 盐边县| 扶风县|