【问题标题】: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。
  • 请看这个问题和好的回复。 stackoverflow.com/questions/28256/…

标签: python python-3.x math stack expression


【解决方案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 是的,我确信我的答案有更好的解决方案,我将阅读您之前在评论中提到的内容,看起来真的很有趣且有用! :)
猜你喜欢
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
相关资源
最近更新 更多