(Pop in Array Based Stack)是否删除元素?
C++ (Pop in Array Based Stack) Do we delete the element?
下面是一些关于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时减少堆栈的大小,而不仅仅是用一个虚拟值"替换"弹出的元素,或者创建一个新的更小的堆栈并复制其余的
- 是否删除在对象构造过程中创建的对象
- 擦除是否删除 stl 无序列图元素使用的堆内存
- 是否删除导致不明确过载的转换
- 打开模板参数:GCC 是否删除开关
- 如果地图擦除范围内的第一个和最后一个相等,则是否删除该元素
- C++是否删除显式对象
- 用错误的标志顺序编译后,是否删除*.cpp文件
- 是否删除非模板类析构函数中的模板类指针
- 是否删除整数的符号扩展
- 如何判断是否删除从函数返回的指针
- 非常简单的C ++:在 fstream 中>>运算符在读取某些内容后是否删除换行符?
- 类内成员初始化是否删除赋值运算符
- STL 容器调用的 Clear() 方法是否删除堆对象
- 提取运算符是否删除分隔符
- 分配动态数组时,是否删除了前面的元素
- STL矢量:当矢量容量因插入而增加时,在分配新的连续内存后,是否删除或保留旧的连续内存
- 编译器是否删除模板中类型的条件语句
- 使用条带是否删除二进制文件上的RTTI信息
- 复制/加载后是否删除
- (Pop in Array Based Stack)是否删除元素?