【问题标题】: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】:
如果您谈论堆栈,您就会谈论抽象数据类型。只要您有推送/弹出功能,您放入堆栈的内容没有区别