堆栈中的负数

时间:2009-11-09 16:29:08

标签: data-structures compiler-construction stack

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

例如:

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

陈述是:

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

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

如果它是合法的,我该如何表示?

谢谢^ _ ^

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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

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

这是你在找什么?

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

首先请注意,短划线' - '用作减法运算符和负号之间存在差异。虽然我们使用相同的字符,但它们有不同的含义。

正整数和负整数(如-4)只占用堆栈中的一个插槽。

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

  

04-2 +

这相当于中缀符号

  

0-4 + 2

这是一些术语:减法运算是一个“二元运算符”,即它需要两个操作数;负号是“一元运算符”,也就是说,它需要一个操作数。 Infix和postfix是二元运算符及其操作数的符号。