stack准确的说并不是STL framework所提供的容器,而是一个为了满足特殊需求而设计的容器。属于容器适配器(container adapter),它提供了简单而清晰的接口满足我们对数据结构堆栈的需求。
对于stack(也称LIFO,后进先出),我们可以使用 push()将任意数量的元素放入stack内,也可以使用 pop()将元素以其插入的反序从容器中移除。
上图可以很形象的看出,我们的压入顺序是A->B,待到我们弹出时的顺序就变成了B->A。
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
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可以是下列任何运算:==、 !=、 >=、 <=、 >、 <。
(1).构造函数
stack(class T, class Container = deque<T>) :创建一个元素类型为T的空栈,容器是deque
(2) 增加函数
- 把元素x压入栈顶:st.push(const T& x);
(3) 删除函数
- 当栈非空的情况下,删除栈顶元素:st.pop();
(4) 判断函数
bool empty() :判断栈是否为空,若为空,则返回true,否则返回false
(5) 大小函数
- int size() :返回栈中元素的数量
(6) 其他函数
- T& top() :当栈非空的情况下返回栈顶元素
代码
#include <iostream>
#include <stack>
using namespace std;
int main()
{
stack<int> st;
for (int i = 0; i < 5; ++i)
st.push(i);
cout<<"st为空 "<<st.empty()<<endl;
cout << "st元素个数 " << st.size() << endl;
cout << "st栈顶元素 " << st.top() << endl;
cout << "依次弹出栈内元素 ";
while (!st.empty())
{
cout << st.top() << "\t";
st.pop();
}
}
运行结果