c++ 栈的弹出

假设现在有一个栈,长度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的内容为

c++ 栈的弹出

由此可以发现,pop并不会删除这个元素,而是让这个元素不能再被直接访问,这个元素依然存在于数组中。

但是这并不会影响栈的压入和弹出操作,因为当进行压入操作时(假如在弹出第五个元素之后再压入一个数x),之前这个位置的元素会被新压入的元素替换掉。

虽然看起来没有什么问题,但是为了保险起见,仍然应当在弹出这个元素之后,将这个地址的值设置为null,代码如下

int MyStack::pop()
{
    int num = a[len-1];//获取这个位置的值
    a[--len] = NULL;//将这个位置的值设置为null
    return num;//返回这个值
}

然后输出结果就变为

c++ 栈的弹出

原文链接: https://www.cnblogs.com/leocc325/p/12738356.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/196271

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午7:12
下一篇 2023年2月12日 下午7:12

相关推荐