目录
1.stack的定义
stack翻译为栈,是STL中实现的一个先进后出,后进先出的容器。它只有一个出口,只能操作最顶端元素。
1.1头文件
要使用stack,应先添加头文件#include<stack>,并在头文件下面加上“using namespace std;”然后就可以使用了。
#include <stack>
1.2定义形式
stack<typename> name;
//typename可以是任意基本数据类型或容器
stack<int>s;
stack<string>s;
stack<node>s; //node是结构体类型
2.stack的常用函数
代码 | 含义 |
push( ) | 向栈压入一个元素 a(s.push(a); ) |
pop( ) | 移除栈顶元素(s.pop(); ) |
top( ) | 返回栈顶元素值 (s.top() ) |
empty( ) | 返回bool型,表示栈内是否为空 (s.empty() ) [true为空,false为非空 ] |
size( ) | 返回栈内元素个数 (s.size() ) |
示例如下:
#include <iostream>
#include <stack>
using namespace std;
int main()
{ stack<int>s;
for(int i=1;i<=5;i++)
{s.push(i);} //push(i)将i压入栈,故此处以此入栈1 2 3 4 5
cout<<"Top:"<<s.top()<<endl;
cout<<"Size:"<<s.size()<<endl;
s.pop(); //将栈顶元素出栈,即 5 出栈
cout<<"Top:"<<s.top()<<endl; //移除栈顶元素后,现在的栈顶元素是 4
if(s.empty())
{cout<<"Is empty"<<endl;}
else{cout<<"Is not empty"<<endl;}
return 0;
}
输出结果:
3.stack的常见用途
stack常用来模拟一些递归,防止程序对栈内存的限制而导致程序出错。一般来说,程序的栈内存空间很小,对有些题目来说,如果用普通的函数来进行递归一旦递归层数过深(不同机器不同,约几千至几万层),则会导致程序运行崩溃如果用栈来模拟递归算法的实现可以避免这一方面的问题(不过这种应用出现较少)。【此处摘抄自《算法笔记》】
4.几点说明
4.1 stack没有迭代器
stack具有先进后出的特点,只能对栈顶元素进行操作。所以stack不提供遍历功能,也不提供迭代器。若想进行遍历,可以将栈中元素取出放在数组中。
主要代码:
stack<int>s;
int a[5],t=0;
for(int i=1;i<=5;i++)
{ s.push(i);}
while(t<5)
{a[t++]=s.top();
s.pop();}
4.2 stack赋值
stack<int>s={1,2,3}; //error stack不可以用一组数直接初始化
stack<int>s(3); //error stack不可以预先分配空间
vector<int>v={1,2,3}; // 栈中元素为1,2,3
stack<int,vector<int>>s1(v);
list<int>l={1,2,3};
stack<int,list<int>>s2(l);
deque<int>d={1,2,3};
stack<int,deque<int>>s3(d);
stack<int>s4(d); //用deque为stack初始化时deque可省