【问题标题】:Postfix expression evaluation: how much stack memory is required?后缀表达式评估:需要多少堆栈内存?
【发布时间】:2014-02-26 08:16:47
【问题描述】:

我觉得这是一个非常愚蠢的问题,但我找不到答案。

假设我们要计算一个后缀表达式,该表达式包含具有不同数量的各种运算符(例如 ADD、SUB 和其他可以采用N 操作数数量的运算符)。评估使用这些运算符构建的后缀表达式需要多少堆栈内存(以元素数量计)?

有没有办法确定所需的内存量?

编辑:这个问题似乎有点模棱两可。我要问的是,这种操作需要的最大堆栈元素数是多少?它甚至可以计算出来,或者它可以是无限多并且取决于表达式?

【问题讨论】:

  • 对于您感兴趣的特定表达式,一次压入堆栈的最大值是多少?这就是你的堆栈深度。
  • @keshlam 这正是我要问的!几个??
  • 我认为最坏的情况是 n!其中 n 是运算符和操作数的数量,但要真正计算实际值非常复杂,因为它取决于很多东西。
  • @emcas88 -- 你为什么会认为 O(n!)?我不可能比 O(n) 差(如果你存储每个运算符的结果),而且应该少得多。

标签: c stack theory postfix-notation


【解决方案1】:

没有固有的最大值。这完全取决于您正在评估的表达式。

【讨论】:

    【解决方案2】:

    这取决于表达式。二进制表达式的经典递归解决方案类似于(在 C 代码中):

    int maxstack(expression *exp) {
        if (IsLeaf(exp)) {
            return 0;
        } else {
            int left_stack = maxstack(exp->left);
            int right_stack = maxstack(exp->right);
            if (left_stack == right_stack)
                return left_stack + 1;
            else if (left_stack > right_stack)
                return left_stack;
            else
                return right_stack;
        }
    }
    

    将此扩展到三元/三元表达式相对简单

    【讨论】:

    • 我们可以说它是按顺序排列的吗?正如评论中之前提到的,它是 O(n!) 吗?我真的在寻找数字(或最坏情况评估)。
    • 上述函数为您提供了所需额外存储量的确切数字。它在表达式的大小上增长为 O(log n)。
    猜你喜欢
    • 1970-01-01
    • 2014-07-01
    • 2011-12-14
    • 2020-07-15
    • 2012-05-01
    • 2013-05-02
    • 2013-10-11
    • 2016-09-23
    • 2021-11-29
    相关资源
    最近更新 更多