为什么我们将堆栈顶部初始化为-1?

为什么我必须将其中一个堆栈初始化为-1? top1指向哪里?

int ar[SIZE]; int top1 = -1; int top2 = SIZE; void push_stack1 (int data) { if (top1 < top2 - 1) { ar[++top1] = data; } else { printf ("Stack Full! Cannot Push\n"); } } 

区别在于你是否让top1指向最后使用的元素或第一个自由元素。

使用-1您可以指向最后使用的元素。

使用0您可以指向第一个自由元素。

在使用预增量/减量和后增量/减量时也存在对称性。

初始化为-1表示用于push的++top1和用于pop的top1--

初始化为0表示top1++表示push, – --top1表示pop。

不,如果你的代码是:你根本不需要将top1初始化为-1

 int ar[SIZE]; int top1 = 0; // 0 `here` int top2 = SIZE; void push_stack1 (int data) { // v conditional check with `<=` instead of `<` if (top1 <= top2 - 1) // even better: `if (top1 < top2)` { ar[top1++] = data; // ^ using "top1++" instead of "++top1" } else { printf ("Stack Full! Cannot Push\n"); } } 

++something (也称为pre-increment)将增加something的值,然后返回递增的值。

然而, something++ (也称为后增量)会增加something的值,但会返回原始值,即在递增之前所持有的something

但是你必须注意,无论是++top1还是top1++ ,我们总是将0作为ar的第一个索引传递,因为0是所有语言中任何数组/列表的第一个索引。

你开始认为在堆栈数据结构的实现中你真的很奇怪 – 你必须用-1初始化top。 惠克书上说的那个? 如果有任何一本书,那么它最好的意思是它们显示的实施方式就是遵循这一点

top1指向哪里? 如果你直接索引到一个数组对象,那么它可能会尝试访问一个超出数组绑定的内存,这肯定是一个未定义的行为(数组在C中是0索引)。 但在每种情况下,我们都会看到top首先增加的实现(如果top-1初始化) ++top然后该值用于索引到数组(这是第一次导致0 ),就是这里的情况。 (这里提到了数组,因为你所展示的代码似乎使用了基础数据结构)。

所以top=-1最初意味着它处于空状态,你可以说没有成员被添加到堆栈数据结构中。 在这里你可以用0初始化top前提是你必须根据需要相应地更改pushpopisEmpty()以及与此数据结构实现相关的其他辅助函数。

您还可以检查其他函数的实现,以获得top=-1的理由,以用于您正在使用的实现。


此外,如果你对++在这里做什么以及它有多重要有疑问 – 看看C11标准对此有什么看法(N1570Draft)

在第6.5.3.1节第2节中

前缀++运算符的操作数的值递增。 结果是增量后操作数的新值。

++top1将导致新的递增值,如果它早于-1 ,则为0