• Dijkstra双栈算术表达式求值


    在看algs4的时候偶然发现了这个算法,又回顾了一遍当时数据结构课程里讲过的知识,当时很不在意.迟早是要还的,哎

    用python实现了,比较麻烦的是我现在没有解决bash传参的问题,''(" ")" "*"都需要转义,我直接把"*"改成了"x".

    这里又见识到了python的强大之处,list可以当做stack用,贴上官网doc

    push就用append,pop正好是内置函数,不说了上代码:

     1 import sys
     2 def evaluate(argv):
     3     argv = argv[1:]
     4     stackOps = list()
     5     stackVals = list()
     6     for string in argv:
     7         if string.isdigit():  #number
     8             stackVals.append(float(string))
     9         else:              #opt or )
    10             if string == "(":
    11                 pass
    12             elif string == ")":
    13                 op = stackOps.pop()
    14                 val = stackVals.pop()
    15                 if op == "+":
    16                     val = stackVals.pop() + val
    17                 elif op == "-":
    18                     val = stackVals.pop() - val
    19                 elif op == "x":
    20                     val = stackVals.pop() * val
    21                 elif op == "/":
    22                     val = stackVals.pop() / val
    23                 stackVals.append(val)
    24             else:
    25                 stackOps.append(string)
    26     print("out:",stackVals.pop())
    27 
    28 
    29 evaluate(sys.argv)

    argv = argv[1:]是切片操作,因为第0号参数是文件名,我们用不上,直接干掉它.

    然后foreach取出list元素,判断是不是数字,以及右括号,运算符.注意程序实现的时候,不是数字且不是右括号都认为是运算符,所以要注意输入.

    如果要增加运算符,运算函数的话需要更改程序.

    在pycharm中开一个terminal:

    cmd:

    (venv) katachi@katachi-Inspiron-7559:~/PycharmProjects/OtherPrj$ python EvaluateWithDijkstraTwo-StackAlgorithm.py ( 1 + ( ( 2 + 3 ) x ( 4 x 5 ) ) )
    out: 101.0

    因为要转义所有很多斜线.去掉左括号也行,因为程序里直接pass了嘛:

    (venv) katachi@katachi-Inspiron-7559:~/PycharmProjects/OtherPrj$ python EvaluateWithDijkstraTwo-StackAlgorithm.py  1 +  2 + 3 ) x  4 x 5 ) ) )
    out: 101.0
  • 相关阅读:
    如何为惠普笔记本ProBook 4431S清理电源风扇通风口灰尘
    office app之 Mail App 从新建到发布
    sublime_text3汉化,破解,安装Package_control支持中文显示
    poj3126prime+BFS
    android开发之欢迎界面
    poj 1151 离散化
    DbVisualizer 9 解决中文乱码问题
    RS232、RS422与RS485串口标准简介
    动态创建菜单和动态关联菜单项事件
    更改路径
  • 原文地址:https://www.cnblogs.com/katachi/p/9571020.html
Copyright © 2020-2023  润新知