【发布时间】: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 没错。幕后没有魔术。代码就像它看起来的那样。