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

栈的内容不多,使用也相对简单,只需要遵守一个原则,就是先进后出。最后加入栈的元素将最先被取出来,在栈的同一端进行数据的插入与取出,这一段叫做“栈顶”。使用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.重载了关系比较符 ==,!=,>,<,<=,>= 。

原创文章 68 获赞 367 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_40692109/article/details/105442300