C++STL特殊容器stack

stack的基本性能

stack准确的说并不是STL framework所提供的容器,而是一个为了满足特殊需求而设计的容器。属于容器适配器(container adapter),它提供了简单而清晰的接口满足我们对数据结构堆栈的需求。

对于stack(也称LIFO,后进先出),我们可以使用 push()将任意数量的元素放入stack内,也可以使用 pop()将元素以其插入的反序从容器中移除。

上图可以很形象的看出,我们的压入顺序是A->B,待到我们弹出时的顺序就变成了B->A。

stack使用须知

1.包含头文件

1 #include<stack>

2.在头文件<stack>中,class stack 定义如下

1 namespace std 2 { 3 template <typename T, 4           typename Container = deque<T>>
5         class stack; 6 }

第一个template参数代表元素类型,带有默认值的第二个template参数用来定义stack内部存放元素的实际容器,默认为deque

很多人问为什么不用vector,具体原因可能是dequ有移除元素时会自动释放内存,并且不必在重新分配reallocation时复制全部元素的优点。

3.我们可以自定义stack的内部容器

stack的实现只是很单纯的把各项操作转化为内部容器的对应调用,事实上,你可以使用任何sequence容器支持stack,只要它们提供函数:back()、push_back()、pop_back。

举个栗子

1 stack<int> st;             //定义一个int类型内部为deque的stack
2 stack<int,vector<int>> st; //定义一个int类型内部为vector的stack

stack核心操作

1.核心接口成员函数

1 st.push();//将一个元素放入stack内
2 st.top();//返回stack内的“下一个”元素
3 st.pop();//从stack中移除元素

注意,pop弹出栈顶元素但不返回它,top返回栈顶元素但不移除它。两者在stack为空时使用会造成不明确的行为,所以在使用前可以采用 empty() 来检验stack是否为空

2.常用函数

1 st.size();  //返回stack内元素数量
2 st.empty(); //返回容器是否为空

3.comparison的重载

stack支持两个相同类型间的比较(比较原则是字典序),从栈底元素开始比较

comparison可以是下列任何运算:==、 !=、 >=、 <=、 >、 <。

 

本文主要针对的是竞赛方向的stack使用,没有涉及更深度的使用,若有错误,请提出指正。

如果能帮助到您,我会非常开心QWQ

2019-01-31