棧的內容不多,使用也相對簡單,只需要遵守一個原則,就是先進後出。最後加入棧的元素將最先被取出來,在棧的同一端進行數據的插入與取出,這一段叫做“棧頂”。使用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.重載了關係比較符 ==,!=,>,<,<=,>= 。