Dijkstra双栈算术表达式求值

时间:2022-05-26 20:32:12

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

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

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

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

 import sys
def evaluate(argv):
argv = argv[1:]
stackOps = list()
stackVals = list()
for string in argv:
if string.isdigit(): #number
stackVals.append(float(string))
else: #opt or )
if string == "(":
pass
elif string == ")":
op = stackOps.pop()
val = stackVals.pop()
if op == "+":
val = stackVals.pop() + val
elif op == "-":
val = stackVals.pop() - val
elif op == "x":
val = stackVals.pop() * val
elif op == "/":
val = stackVals.pop() / val
stackVals.append(val)
else:
stackOps.append(string)
print("out:",stackVals.pop()) evaluate(sys.argv)

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

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

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

在pycharm中开一个terminal:

cmd:

(venv) katachi@katachi-Inspiron-:~/PycharmProjects/OtherPrj$ python EvaluateWithDijkstraTwo-StackAlgorithm.py \(  + \( \(  +  \) x \(  x  \) \) \)
out: 101.0

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

(venv) katachi@katachi-Inspiron-:~/PycharmProjects/OtherPrj$ python EvaluateWithDijkstraTwo-StackAlgorithm.py   +   +  \) x   x  \) \) \)
out: 101.0