在看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