堆栈的这个实现看起来有问题,但它运行良好

Something looks wrong in this implementation of stack but it works fine

本文关键字:运行 有问题 实现 看起来 堆栈      更新时间:2023-10-16

我有一个任务,需要使用数组实现堆栈(很简单),但其中三个方法已经提供,我只需要实现剩下的两个函数:peek()和flush()。

然而,我似乎不太同意所提供的pop的实现。我的意思是,当你在里面没有任何元素(N==0)的情况下弹出时,这意味着类似于Array[-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 */
        }
};

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

它有一个先决条件:如果堆栈为空,就不能调用它。是强制执行该前提条件(检查该前提条件需要运行时成本)还是只记录它(有无效行为的风险)是您的设计决策。

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

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

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

在数组开始之前访问数据是未定义的行为,这确实意味着这一点。它可以做任何事情,包括不崩溃。