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

猜你喜欢

转载自www.cnblogs.com/katachi/p/9571020.html