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的内容为

 

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

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

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

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

然后输出结果就变为

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM