Dijkstra双栈算术表达式求值

Posted katachi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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) [email protected]7559:~/PycharmProjects/OtherPrj$ python EvaluateWithDijkstraTwo-StackAlgorithm.py ( 1 + ( ( 2 + 3 ) x ( 4 x 5 ) ) )
out: 101.0

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

(venv) [email protected]7559:~/PycharmProjects/OtherPrj$ python EvaluateWithDijkstraTwo-StackAlgorithm.py  1 +  2 + 3 ) x  4 x 5 ) ) )
out: 101.0

 

以上是关于Dijkstra双栈算术表达式求值的主要内容,如果未能解决你的问题,请参考以下文章

Dijkstra双栈算术表达式求值

栈练习--Dijkstra的双栈算术表达式求值算法

Dijkstra的双栈算术表达式的求值算法

C语言编一个实现简单的算术表达式求值的代码。

C++:算术表达式求值

双栈完全解决计算器问题