2017-01-03 72 views
0

我试图构建一个任意精度计算器。 我代表链接列表中的数字(一个节点是一个数字),我想将它们存储在一个堆栈中。 但是,我似乎无法弄清楚如何在保持正确的数学运算顺序的同时将接收到的数学表达式拆分为一个字符串。例如,如果插入的表达式是6*8-2+8-8*9/4,我会将数字表示为链接列表并将它们插入到堆栈中,然后将这些操作符插入到不同的堆栈中,然后我想弹出每个计算的参数,然后再次推算结果,等等,直到我得到最终结果。从字符串评估数学表达式并将其插入到堆栈中

我的问题是,我该如何实现这一点,仍然遵循数学运算的顺序?

+0

一个常见的方法是首先将表达式转换为[RPN](https://en.wikipedia .org/wiki/Reverse_Polish_notation)使用Dijkstra的[Shunting-yard算法](https://en.wikipedia.org/wiki/Shunting-yard_algorithm) –

+0

首先,使用标准库的shlex来标记,然后提出语法并实现一个解析器。我发现shift减少了解析器最容易理解和实现的地方。我最近在github上做了一个玩具项目 - 缩节器。 – jbasko

+0

请看这个问题和很好的答复。 http://stackoverflow.com/questions/28256/equation-expression-parser-with-precedence – rajah9

回答

0

你可以尝试使用eval

eval("6*8-2+8-8*9/4") 

这将使你36

编辑:

如果EVAL是不可行的,也许尝试operator字符串运算符将数学的:

import operator 
operations = { 
    '+' : operator.add, 
    '-' : operator.sub, 
    '*' : operator.mul, 
    '/' : operator.div, 
    '%' : operator.mod, 
    '^' : operator.xor 
} 

那么也许你可以通过字符串循环并评估它的方式? (我现在想想循环部分,并编辑我的答案,如果我有什么好的)

+0

我希望。这是一个大学项目,我需要按照我写的那样完成它。 – mrpink121

+0

啊,够公平的,我会有一个想法,并更新我的答案,如果我拿出任何有用的东西:) – RichSmith

+0

谢谢你亲切先生! – mrpink121