c++ stack(栈)的使用指南

C++ 中的栈遵循先进后出的原则,主要通过容器适配器`stack`来实现。栈默认使用`deque`作为底层容器,但也可配置为`vector`等。栈接口简洁,避免了不必要的操作,没有迭代器且无法通过下标访问元素。构造栈时可以指定数据类型T和底层容器类型,如未指定则默认使用`deque`。栈的大小可以通过成员函数获取,同时支持非成员函数如`swap`和关系比较运算符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

栈的内容不多,使用也相对简单,只需要遵守一个原则,就是先进后出。最后加入栈的元素将最先被取出来,在栈的同一端进行数据的插入与取出,这一段叫做“栈顶”。使用STL的stack需要include一个头文件<stack>

容器适配器:

首先我们要明白stack其实是一种容器适配器,它和容器是不一样的。像vector,deque这种称为容器,而容器适配器只是提供了相关接口,内部使用的还是别的容器。比如stack内部默认使用的为deque,也可以设置为使用vector等。相当于对这些容器接口进行了封装,封闭了一些不需要的接口,只留下我们需要的接口。

就像我之前的一个疑问:既然stack能做的,vector都能做,那为什么不直接使用vector呢?其实要用vector,deque代替stack完全可以,但是我们使用stack的目的就是为了告诉你,这是一个栈。对接口的封装也是为了防止栈操作以外的误操作,也就是防止熊孩子不按规矩使用。因此,stack容器没有迭代器,且不能通过下标访问元素。

构造:

template <class T, class Container = deque<T> > class stack;

如上,这对尖括号中有两个参数,第一个是T,表示栈中存放的数据的类型,比如int,double,或者结构体之类。
第二个参数指明底层实现的容器类型,也就是指明这个栈的内部实现方式,比如vector,deque,list。如果不指明它,默认使用deque(双端队列)。当然一般情况下不需要指定这一项参数。下面看一下官方文档的例子:

// constructing stacks
#include <iostream>       // std::cout
#include <stack>          // std::stack
#include <vector>         // std::vector
#include <deque>          // std::deque

int main ()
{
  std::deque<int> mydeque (3,100);          // deque with 3 elements
  std::vector<int> myvector (2,200);        // vector with 2 elements

  std::stack<int> first;                    // empty stack
  std::stack<int> second (mydeque);         // stack initialized to copy of deque

  std::stack<int,std::vector<int> > third;  // empty stack using vector
  std::stack<int,std::vector<int> > fourth (myvector);

  std::cout << "size of first: " << first.size() << '\n';
  std::cout << "size of second: " << second.size() << '\n';
  std::cout << "size of third: " << third.size() << '\n';
  std::cout << "size of fourth: " << fourth.size() << '\n';

  return 0;
}

运行结果:
size of first: 0
size of second: 3
size of third: 0
size of fourth: 2 

其成员函数:

stack::emplace//删除末尾元素
stack::empty//判断容器是否为空
stack::pop//删除末尾元素
stack::push//向末尾插入元素
stack::size//返回容器元素个数
stack::swap//交换容器
stack::top//返回末尾元素

非成员函数:

1.除了stack自带的swap函数外,还要STL通用算法,即swap(stack1,stack2),这和其他STL容器类似。

2.重载了关系比较符 ==,!=,>,<,<=,>= 。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值