【问题标题】:How can I estimate the stack space needed to turn an infix expression into a postfix expression如何估计将中缀表达式转换为后缀表达式所需的堆栈空间
【发布时间】:2013-03-12 21:24:00
【问题描述】:

有著名的shunting-yard algorithm,可用于将中缀表达式(如1 + 2 * 3)转换为后缀表达式(如1 2 2 * +)。调车场算法需要一个栈来存储即将被移动的元素。

是否可以预先估计在线性时间和恒定内存中将特定输入转换为其后缀形式所需的堆栈长度?

【问题讨论】:

  • 会在输入上运行调车场算法但计数而不是推动和弹出操作符作为答案吗?
  • @groovy IIRC 你需要知道堆栈的内容才能运行调车场,比如说,如果你有括号。

标签: algorithm stack estimation shunting-yard


【解决方案1】:

当然。 shunting-yard algorithm 仅将运算符(包括括号)推入堆栈,因此一阶近似值是表达式中运算符的数量。有了更多的智能,您可以扫描表达式并寻找关联性和分组。但是当您完成时,您可能已经编写了一个基于堆栈的算法来确定表达式所需的堆栈大小的最佳估计值,并且会使您的执行成本翻倍。

【讨论】:

  • 感谢您的回答。我想做这个估计,因为我想避免递归算法。在估计其他东西之前我已经必须通过中缀表达式,所以我认为通过预先计算我需要的堆栈大小来保存对 malloc 的调用是一个简单的优化。
  • 调车场算法是非递归的。算法不是递归的,因为它使用堆栈作为数据结构。使用堆栈作为数据结构比使用递归调用占用更少的内存
  • 是的,我知道。这就是为什么我使用 Shutting yard 而不是推出递归解析器的原因。我只是想估计一下避免重复调用 malloc 所需的堆栈数量。
【解决方案2】:

在旧的 HP-45 计算器上,我们总是扫描嵌套最深的括号,然后从那里开始计算。这应该是输入中 N 个标记的快速 O(N) 算法。

在实践中,创建一个能炸毁 HP-45 的 4 高堆栈的表达式具有挑战性。

【讨论】:

  • 谢谢你的回答,虽然我看不出这与调车场算法有什么关系。
猜你喜欢
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
相关资源
最近更新 更多