栈与队列是C++标准库中的两个数据结构。
栈
栈先进后出
,提供 push 和 pop 等接口,所有元素必须符合先进后出的原则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。
栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。
所以STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。
我们常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构。deque是一个双向队列,只要封住一段,只开通另一端就可以实现栈的逻辑了。
如图所示,栈先进后出。
我们也可以指定vector为栈的底层实现,初始化语句如下:
std::stack<int, std::vector<int> > third; // 使用vector为底层容器的栈
常用操作
stack<int> st;
int x;
// 1. 将 x 压入栈
st.push(x);
// 2. 删除栈顶元素
st.pop();
// 3. 返回栈顶元素
st.top();
// 4. 返回栈中元素的数量
st.size();
// 5.检查栈是否为空,若为空返回 true,否则返回 false
st.empty();
队列
队列是先进先出
的数据结构,同样不允许有遍历行为,不提供迭代器, SGI STL中队列一样是以deque为缺省情况下的底部结构。
常用操作
queue<int> que;
int x;
// 1. 在队尾插入一个元素
que.push(x);
// 2. 删除队列第一个元素
que.pop();
// 3. 返回队列中元素的个数
que.size();
// 4. 如果队列为空返回 true,否则返回 false
que.empty();
// 5. 返回队列中的第一个元素
que.front();
// 6. 返回队列中最后一个元素
que.back();
也可以指定list 为起底层实现,初始化queue的语句如下:
std::queue<int, std::list<int>> third; // 定义以list为底层容器的队列