【问题标题】:How to write an algorithm in java to evaluate an arithmetic expression with brackets [duplicate]如何在java中编写算法来评估带括号的算术表达式[重复]
【发布时间】:2013-09-02 11:57:32
【问题描述】:

我了解如何编写不带括号的 java 算法。

  1. 创建两个堆栈:一个操作数堆栈和一个运算符堆栈。
  2. 当我们读取一个表达式时,继续在一个中添加运算符,在另一个中添加操作数。
  3. 具有较低优先级的运算符不能存储在具有较高优先级的运算符上。在这种情况下,我们弹出该运算符并应用于操作数堆栈中的顶部操作数并保留 结果到位。

但如果它涉及像[] or {} or () 这样的括号。评估表达式的逻辑是什么?例如

([12*3] + (8/2)) + (5+5)/(4*2)-3+(7-3)

【问题讨论】:

  • 你试过了吗?
  • 是的..没有括号我试过了。使用括号逻辑我需要理解..检查了几个旧博客,但无法弄清楚它是如何工作的。
  • Wikipedia 上的“详细算法”和“详细示例”描述了如何处理括号。
  • 如果您了解带括号的调车场算法,将其扩展到一种以上的括号应该是微不足道的。只需完全做与括号相同的操作即可。

标签: java algorithm data-structures stack postfix-notation


【解决方案1】:

您正在描述 Dijkstra 的 shunting-yard algorithm 的一个奇怪变化。 Dijkstra 的版本在过去 50 年中一直是规范,它处理分组操作(圆括号、方括号、)很好。

【讨论】:

    【解决方案2】:

    计算算术表达式的常用方法是开发或查找算术表达式的语法,例如参见此处http://www.csse.monash.edu.au/~lloyd/tildeProgLang/Grammar/Arith-Exp/,然后编写“递归下降解析器”。这些程序的结构非常接近语法。一旦你看到一个,你就会欣赏这种方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多