【问题标题】:negative number in the stack堆栈中的负数
【发布时间】:2010-12-14 16:48:57
【问题描述】:

我是编译器世界的新学生^_^,我想知道堆栈中的负数是否合法。

例如:

中缀:1-5=-4 后缀:15-

陈述是:

push(1)
push(5)
x=pop()
y=pop()
t=sub(y,x)
push(t)

堆栈中的最终结果将是 (-4)

如果合法,我该如何表示??

谢谢^_^

【问题讨论】:

  • 你拥有的东西在我看来是合理的。你有什么问题?

标签: data-structures compiler-construction stack


【解决方案1】:

如果您指的是用文本表示表达式(可能在程序读取的文件中),那么您可能会为您的表达式定义一些语法规则 - 比如说用空格分隔标记

例如,后缀中的 444/ 是否与中缀中的 (4 / 44) 或 (44 / 4) 或 (4 / (4 / 4)) 相同?您需要某种方法来分隔多位数字。

现在,假设您决定使用空格,您可以制定一个规则,负整数将是一个减号,后跟一系列数字,没有任何分隔空格

所以中缀表达式'-1 * (3 ^ (-4) - 7' 可以变成'-1 3 -4 ^ * 7 -'

这就是你要找的吗?

PS - 使用适当的解析器,您实际上可以在没有运算符空格的情况下做到这一点,但您仍然需要将操作数彼此分开。

【讨论】:

    【解决方案2】:

    首先请注意,用作减法运算符和用作负号的破折号“-”之间存在区别。虽然我们使用相同的字符,但它们具有不同的含义。

    正整数和负整数,如 -4,在堆栈中只占一个槽。

    如果你的 postifx 语言只能接受一位整数和算术运算符,你可以通过从零减去来表示负数:

    04-2+

    这在中缀表示法中等效于

    0-4+2

    这里有一些术语:减法运算是一个“二元运算符”,即它需要两个操作数;负号是“一元运算符”,即它需要一个操作数。中缀和后缀是二元运算符及其操作数的符号。

    【讨论】:

      【解决方案3】:

      如果您谈论堆栈,您就会谈论抽象数据类型。只要您有推送/弹出功能,您放入堆栈的内容没有区别

      【讨论】:

        【解决方案4】:

        是的。负数存储在内存中的Two's complement form 中,因此您不需要在堆栈上为符号添加额外的单元格。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-16
          • 2019-08-05
          • 2013-02-11
          相关资源
          最近更新 更多