我有这个分配,我需要使用数组实现一个堆栈(你很容易),但已经提供了三个方法,我只需要实现剩下的两个函数:peek()和flush()。
但是,我似乎并不同意pop提供的实现。 我的意思是,当你弹出没有任何元素(N == 0),那么它将意味着类似于数组[-1],程序应该崩溃,但它不会。请解释一下(不会崩溃)是如何发生的。
class STACK {
private:
int* s;
int N;
public:
STACK(int maxN) {
s = new int[maxN];
N = 0;
}
int empty() const {
return N == 0;
}
void push(int item) {
s[N++] = item;
}
int peek() {
/* implement this part */
}
int pop() {
return s[--N];
}
void flush() {
/* also implement this part */
}
};
答案 0 :(得分:1)
我似乎并不同意pop提供的实现。
它有一个前提条件:如果堆栈为空,则不能调用它。是否强制执行该前提条件(检查运行时成本)或仅记录它(存在无效行为风险)是您做出的设计决定。
请解释这是如何发生的(不会崩溃)。
未定义的行为并不一定会导致程序崩溃。如果在阵列之前有可寻址的内存,那么s[--N]
(几乎可以肯定)只会阅读那里的内容。如果没有,那么它可能会崩溃。
答案 1 :(得分:1)
你是对的。当堆栈为空时,写入的pop函数将失败。
在数组启动之前访问数据是未定义的行为,这恰恰意味着这一点。它可以执行任何,包括不崩溃。