(Pop in Array Based Stack)是否删除元素?

C++ (Pop in Array Based Stack) Do we delete the element?

本文关键字:是否 删除 元素 Stack Pop in Array Based      更新时间:2023-10-16

下面是一些关于STACK使用ARRAY实现的讲义中的代码。

规格中:

template <typename T>
class Stack {
public:
    Stack();
    bool pop (T& stackTop);
    //there is still some other code
private:
    int maxSize;
    int* arr;
    int _size;
}

在实现中:

bool Stack<T>::pop(T& stackTop){
    if (isEmpty()){ 
        return false;
    }else{
        --_size;
        stackTop=arr[_size];
        return true;
    }
}

和一些用户程序的例子:

Stack<int> st;
int k;
st.push(1);st.push(2);st.push(3);//will add element 1 ,2, and 3.
st.pop(k);cout<<"pop"<<k<<endl; //will pop the last element which is 3 and print pop 3

我知道在pop实现中,我们更新(减少一个)数组的大小。但是我们似乎并没有删除这个元素!那么,元素是否还在那里,而我们只是减小了它的大小,这样数组的顶部就被移动了?如。我的最大尺寸是100在代码中,我按下1,2,3。现在顶部在第3层。剩下的97个元素还没有赋值。现在pop(最后一个元素是3)当我弹出时,我只是将顶部"移动"到2。但实际上3还在,剩下的97个元素还没有赋值。???

请解释一下它的工作原理

弹出一个元素应该从堆栈中删除它,但同时返回相同的元素(是删除它还是进一步处理它取决于你)。

如果你使用一个静态结构数组等堆栈可以简单地取消单元格的内容,代表你的堆栈的顶部你刚刚出现,返回该元素(如果你存储的值,那么你只是返回它否则返回引用)并设置索引元素下面的新顶部或创建一个数组的副本和一个更小的尺寸和复制的内容没有出现在那里。您可以优化最后一种方法,尝试在一个批处理中一个接一个地执行多个弹出,然后将堆栈"刷新"到一个更新的较小的堆栈。我个人更喜欢第一种方式,因为堆栈通常被认为是具有一定大小的东西(=具有有限容量而不是动态容量的堆栈)。

在弹出时删除元素是堆栈弹出的工作方式,如果你只是把旧值留在那里,它可能会导致一些愚蠢的情况,比如覆盖一个元素,你已经通过push命令弹出,但根本不想覆盖。如果你用正确的方法,你总是知道,一旦弹出,这个值就不能再从堆栈中检索(除了弹出它的那一刻),因为它不再存在!

你也可以使用单个链表来实现,然后你可以在执行pop时减少堆栈的大小,而不仅仅是用一个虚拟值"替换"弹出的元素,或者创建一个新的更小的堆栈并复制其余的