【问题标题】:Calculator stack计算器堆栈
【发布时间】:2011-01-04 12:02:06
【问题描述】:

我对计算器的理解是它们是基于堆栈的。当你使用大多数计算器时,如果你输入1 + 2 [enter] [enter],你会得到51 被压栈,+ 是操作符,然后2 被压栈。第一个[enter] 应该从堆栈中弹出12,添加它们以获得3,然后将3 推回堆栈。第二个[enter] 不应访问2,因为它实际上不存在于任何地方。

如何保留2 以便第二个[enter] 可以使用它?

2 是在 3 之前被推回堆栈还是保留在其他地方供以后使用?如果它被推回堆栈上,您是否可以通过反复执行[operator] [number] [enter] [enter]来导致堆栈溢出?

【问题讨论】:

  • 只是一个观察,问题包含术语“堆栈溢出”......有趣:)
  • @kpax:有趣但并非完全巧合。尽管有误导性的标志,但这种编程现象正是该网站命名的原因。

标签: data-structures stack calculator


【解决方案1】:

从概念上讲,在硬件中,这些值被放入寄存器。在简单的 ALU(算术逻辑单元(即简单的 CPU))中,其中一个寄存器将被视为累加器。您正在讨论的值可以放在堆栈上进行处理,但是一旦堆栈为空,寄存器值(包括最后一次操作)可能会缓存在这些寄存器中。当被告知再次执行操作时,它使用累加器以及最后一个参数。

例如,

                    Reg1     Reg2 (Accumulator)  Operator
Input 1                         1
Input +                         1                  +
Input 2               2         1                  +
Enter                 2         3                  +
Enter                 2         5                  +
Enter                 2         7                  +

所以它可能是正在使用的硬件的功能。

【讨论】:

    【解决方案2】:

    唯一真正的基于堆栈的计算器是具有反向波兰表示法作为输入法的计算器,因为该表示法直接在堆栈上运行。

    【讨论】:

    • 中缀表达式可以很容易地转换为后缀表达式,然后可以使用堆栈。
    • 对。值得强调的是,普通的手动计算器根本不是基于堆栈的。正如马特指出的那样,他们可能只有两个寄存器。他们不做运算符优先级或括号(需要堆栈的功能)。
    【解决方案3】:

    您需要做的就是保留最后一个运算符和操作数,并在堆栈为空时应用它们。

    【讨论】:

    • 从技术上讲,堆栈不会为空。它将包含最终计算出的数字。
    • 很公平。如果堆栈不包含可用的运算符,则。
    【解决方案4】:

    【讨论】:

      猜你喜欢
      • 2012-06-26
      • 2017-08-18
      • 2010-09-26
      • 2012-12-14
      • 2016-01-23
      • 2015-09-15
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      相关资源
      最近更新 更多