在这个堆栈实现中看起来有些错误,但它运行正常

时间:2015-02-27 15:51:01

标签: c++

我有这个分配,我需要使用数组实现一个堆栈(你很容易),但已经提供了三个方法,我只需要实现剩下的两个函数: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 */

        }
};

2 个答案:

答案 0 :(得分:1)

  

我似乎并不同意pop提供的实现。

它有一个前提条件:如果堆栈为空,则不能调用它。是否强制执行该前提条件(检查运行时成本)或仅记录它(存在无效行为风险)是您做出的设计决定。

  

请解释这是如何发生的(不会崩溃)。

未定义的行为并不一定会导致程序崩溃。如果在阵列之前有可寻址的内存,那么s[--N](几乎可以肯定)只会阅读那里的内容。如果没有,那么它可能会崩溃。

答案 1 :(得分:1)

你是对的。当堆栈为空时,写入的pop函数将失败。

在数组启动之前访问数据是未定义的行为,这恰恰意味着这一点。它可以执行任何,包括不崩溃。