假设现在有一个栈,长度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;//返回这个值
}
然后输出结果就变为
原文链接: https://www.cnblogs.com/leocc325/p/12738356.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/196271
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!