STL之容器stack

目录

栈的底层实现原理

1. stack定义和初始化

2.stack的赋值

3. stack进栈和出栈

4. stack判空和大小

5. 注意事项(附加)

欢迎关注微信公众号 “三贝勒文子” ,每天学习C++


      

        学过数据结构的小伙伴都知道栈(stack),它是一种存放数据的结构体,以往我们在学习编程的时候都会自己去实现一个栈,今天,小编告诉你C++的STL给我们提供了stack容器,这个容器就是栈。

        栈的特性就是先进后出,而且只有一个开口,只能在一端进行数据的插入和删除操作。如下图所示:

栈的底层实现原理

    在STL中,栈的底层实现原理默认是双端队列deque,但是你也可以通过vector或者list去实现stack。

    如果你要使用stack容器,那么需要添加头文件

# include<stack>

1. stack定义和初始化

  • 默认构造函数:

  • 拷贝构造函数:

// stack<T> stkT;//stack采用模板类实现, stack对象的默认构造形式:
// stack(const stack &stk);//拷贝构造函数
​
stack<int> serven_stk1;          // 空栈,默认构造函数
stack<int> serven_stk2(serven_stk1);  // 拷贝构造函数

2.stack的赋值

operator=:重写operator=操作符。

// stack& operator=(const stack &stk);//重载等号操作符
​
/* stack的赋值操作 */
serven_stk1.push(1);
serven_stk1.push(2);
​
serven_stk2 = serven_stk1;        // 将栈serven_stk1拷贝给栈serven_stk2
​
cout<<"栈serven_stk1的出栈顺序为:";
Print_Stack(serven_stk1);
​
​
cout<<"栈serven_stk2的出栈顺序为:";
Print_Stack(serven_stk2);
cout<<endl;

运行结果:

3. stack进栈和出栈

  • push(val):元素入栈

  • pop():元素出栈

  • top():获取栈顶元素

// push(elem);//向栈顶添加元素
// pop();//从栈顶移除第一个元素
// top();//返回栈顶元素
​
​
/* stack的进栈和出栈操作 */
serven_stk1.push(5);    // 进栈
serven_stk1.push(4);    // 进栈
serven_stk1.push(3);    // 进栈
cout<<"出栈前serven_stk1的长度:"<<serven_stk1.size()<<endl;
serven_stk1.pop();      // 出栈
cout<<"出栈后serven_stk1的长度:"<<serven_stk1.size()<<endl;
​
cout<<"栈serven_stk1的栈顶元素为:"<<serven_stk1.top()<<endl;
cout<<"栈serven_stk1的长度:"<<serven_stk1.size()<<endl<<endl;

运行结果:

4. stack判空和大小

empty():

size():

// empty();//判断堆栈是否为空
// size();//返回堆栈的大小
​
/* stack判空 */
cout<<"栈serven_stk1是否为空栈:"<<serven_stk1.empty()<<endl;
cout<<"栈serven_stk1的长度:"<<serven_stk1.size()<<endl;

运行结果:

5. 注意事项(附加)

    在上面的打印栈元素的函数Print_stack中,参数的传递有三种,值传递、引用传递和指针传递,在这里就想告诉你只有值传递打印栈,执行pop()后,实参的栈里面的元素都还在。引用传递和指针传递在函数里面执行pop()后实参的栈的元素就都不见了。

/*  参数传递*/
cout<<"栈serven_stk2的出栈顺序为:";
Print_Stack(serven_stk2);
cout<<"栈serven_stk2的长度:"<<serven_stk2.size()<<endl;
​
cout<<"栈serven_stk2的出栈顺序为:";
Print_StackRef(serven_stk2);
cout<<"栈serven_stk2的长度:"<<serven_stk2.size()<<endl;
  
  
  /* 值传递函数 */
void Print_Stack(stack<int> ser){
  while(!ser.empty()){
    cout<<ser.top()<<" ";
    ser.pop();
  }
  cout<<endl;
}
  /* 引用传递函数 */
void Print_StackRef(stack<int>& ser){
  while(!ser.empty()){
    cout<<ser.top()<<" ";
    ser.pop();
  }
  cout<<endl;
}

运行结果:

    可以看到引用传递的结果就是,栈的大小变成0了,而值传递就还是2。 这个跟本章节的栈没多大关系,只是小编在这里告诉你一下,值传递和引用传递的区别和效果。

    既然说到这里了,就再说一下吧。在我们调用函数的时候,编译器会给函数里面的形参申请内存空间,然后将实参的数据拷贝一份放置到形参的内存空间中。

值传递:

引用传递:

这两张图很明显了吧~~

欢迎关注微信公众号 “三贝勒文子” ,每天学习C++

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三贝勒文子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值