假设现在有一个栈,长度num=5,len表示栈中已有的元素,arraylen表示栈的总容量。
假设有方法pop用来弹出栈中的元素,有方法push用来压入元素。
分别给出构造函数和pop方法。
MyStack::MyStack(int num) { a = new int[num]; len = 0; arraylen = num; } int MyStack::pop() { return a[--len]; } void MyStack::push(int num) { if (len == arraylen) { resize(arraylen * 2); arraylen *= 2; } a[len++] = num; }
由pop方法中可以看到,所执行的操作为:先将len-1,然后返回元素a[len];
那么问题来了
假设len=5,将第五个元素返回后,len=4.。
此时第五个元素是被删除了还是仅仅还是无法访问到这个元素?
在函数中添加代码来手动访问第五个位置的元素,代码如下
int MyStack::test(int num) { return a[num]; }
在main函数中添加代码
int main() { MyStack stack(5); stack.push(7); stack.push(2); stack.push(5); stack.push(8); stack.push(3); stack.pop(); cout <<"现在栈中有"<<stack.size()<<"个元素,分别是"<<stack.showstack()<<endl<<stack.test(4); }
即,新建一个栈,并往栈中添加五个元素,并弹出第五个元素,此时cout的内容为
由此可以发现,pop并不会删除这个元素,而是让这个元素不能再被直接访问,这个元素依然存在于数组中。
但是这并不会影响栈的压入和弹出操作,因为当进行压入操作时(假如在弹出第五个元素之后再压入一个数x),之前这个位置的元素会被新压入的元素替换掉。
虽然看起来没有什么问题,但是为了保险起见,仍然应当在弹出这个元素之后,将这个地址的值设置为null,代码如下
int MyStack::pop() { int num = a[len-1];//获取这个位置的值 a[--len] = NULL;//将这个位置的值设置为null return num;//返回这个值 }
然后输出结果就变为