【问题标题】:C++ (Pop in Array Based Stack) Do we delete the element? [closed]C ++(基于数组的堆栈中的弹出)我们删除元素吗? [关闭]
【发布时间】:2015-10-03 11:03:43
【问题描述】:

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

在规范中:

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 个元素仍未分配。 现在我弹出(这是最后一个元素 3)。 当我弹出时,我只是将顶部“移动”到 2。但实际上 3 仍然存在,其余 97 个元素仍未分配。 ???

请解释它是如何工作的。

【问题讨论】:

  • 您正在按值存储元素。并考虑这一点:您的 push 具有相同的工件。例如:如果你的 int x = 3; st.push(x);x 突然不再期望是 3 ?仅仅因为您的 pop 减少了堆栈“顶部”索引并不意味着它之前索引的数组内容消失了(除非 选择覆盖它)。
  • 你是对的; arr[] 中的第三个条目仍然是 3。如果您在对 st.pop(k); 的调用之后使用 st.push(42); 之类的内容,则第三个元素将被覆盖。
  • 如果没有必要,为什么要删除某些内容。这就像您的文件系统的工作方式一样。它只是摆脱了对文件的引用。该文件仍在“死”空间中等待被覆盖
  • @MattOlson 所以它实际上仍然存在,只是通过更新大小移动了顶部。所以基本上它(3)现在与其余 97 个元素相同,只是它被分配给 3,但“功能”等是一样的。
  • @mon 没错。幕后没有魔术。代码就像它看起来的那样。

标签: c++ arrays stack


【解决方案1】:

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

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

弹出时删除元素是弹出堆栈的工作方式,如果您只是将旧值保留在那里,它可能会导致诸如覆盖元素之类的愚蠢情况,您已通过推送命令弹出但没有想要完全覆盖。如果您以正确的方式执行此操作,您总是知道一旦弹出该值就无法再从该堆栈中检索(弹出时除外),因为它不再存在!

您还可以使用单个链表来实现,然后您确实可以在执行弹出操作时减小堆栈的大小,而不仅仅是用虚拟值“替换”弹出的元素或创建一个新的更小的堆栈并复制其余的都在那里。

【讨论】:

    猜你喜欢
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2013-11-07
    • 2018-05-02
    • 2023-03-31
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多