从字符串评估数学表达式并将其插入堆栈

Posted

技术标签:

【中文标题】从字符串评估数学表达式并将其插入堆栈【英文标题】:Evaluating mathematical expression from a string and inserting it on stack 【发布时间】:2017-05-17 15:26:45 【问题描述】:

我正在尝试构建一个任意精度的计算器。 我在链表中​​表示数字(一个节点是一个数字),我想将它们存储在堆栈中。 但是,我似乎无法弄清楚如何在保持正确的数学运算顺序的同时将作为字符串接收的数学表达式分开。

例如,如果插入的表达式是6*8-2+8-8*9/4,我将数字表示为链表并将它们插入堆栈,并将运算符插入不同的堆栈,然后我想弹出每个计算的参数并再次推送结果,以此类推,直到我得到最终结果。

我的问题是,我怎样才能实现这个并且仍然遵循数学运算顺序?

【问题讨论】:

一种常用的方法是首先使用 Dijkstra 的 Shunting-yard algorithm 将表达式转换为 RPN 首先使用标准库的shlex进行分词,然后提出语法,实现解析器。我发现 shift reduce 解析器是最容易理解和实现的。我最近在这方面做了一个玩具项目——github上的shreducers。 请看这个问题和好的回复。 ***.com/questions/28256/… 【参考方案1】:

你可以试试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

那么也许您可以遍历字符串并以这种方式评估它? (我现在会考虑循环部分,如果我得到任何好的结果,我会编辑我的答案)

【讨论】:

我希望。这是一个大学项目,我必须完全按照我写的那样去做。 啊,很公平,如果我想出任何有用的东西,我会思考并更新我的答案:) 谢谢您的好心先生! 如果你按照严格的从左到右的顺序计算东西,这样做是可以的,但是如果你想使用通常的数学优先规则并且你需要处理带括号的表达式,它就会变得棘手。 @PM2Ring 是的,我确信我的答案有更好的解决方案,我将阅读您之前在评论中提到的内容,看起来真的很有趣且有用! :)

以上是关于从字符串评估数学表达式并将其插入堆栈的主要内容,如果未能解决你的问题,请参考以下文章

用于具有一个变量的数学表达式的 C 解析器并将其保存到函数中

根据正则表达式拆分字符串

无法评估表达式,因为代码已优化或本机框架位于调用堆栈顶部

如何回显数学表达式的结果并将其保存到Bash中的变量中

评估数学表达式的最佳和最短方法

如何取出包含数学表达式并给出结果的字符串的某些部分