为什么我必须将其中一个堆栈初始化为-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 Pushn"); } }
区别在于你是否让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 Pushn"); } }
++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
, 前提是你必须根据需要相应地更改push
, pop
或isEmpty()
以及与此数据结构实现相关的其他辅助函数。
您还可以检查其他函数的实现,以获得top=-1
的理由,以用于您正在使用的实现。
此外,如果你对++
在这里做什么以及它有多重要有疑问 – 看看C11标准对此有什么看法(N1570Draft)
在第6.5.3.1节第2节中
前缀
++
运算符的操作数的值递增。 结果是增量后操作数的新值。
++top1
将导致新的递增值,如果它早于-1
,则为0
。
以上就是c/c++开发分享为什么我们将堆栈顶部初始化为-1?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522211.html