stack的默认存储空间也是deque,可以使用的容器类型包括deque、vector、list,是LIFO(先入后出)栈,即只能从一端进出,并且先入后出。
stack有以下三层含义:(1)数据结构:作为一组数据的存放方式,像上述说的一样LIFO,是本文重点讲述内容;
(2)代码运行方式:调用栈,表示函数或子例程像堆积木一样存放,以实现层层调用;
(3)内存区间:存放数据的一种内存区域,程序运行的时候需要内存空间存放数据。一般来 说,系统会划分出两种不同的内存空间,一种叫栈stack,一种叫堆heap。
先讲讲stack作为数据结构的用法,包括入栈、出栈、访问栈顶、删除元素、遍历输出等基本操作,还是以程序代码的方式展现。
// stack函数的基本操作
#include<iostream>
#include<stack>
#include<list>
#include<vector>
#include<string>
using namespace std;
int main()
{
stack<int,vector<int> > s;
for(int i=0;i<10;i++)
{
s.push(i);//stack的push压栈操作
}
cout<<"stack s的大小为:"<<s.size()<<endl; //size函数
cout<<"stack s的top操作:"<<s.top()<<endl;//top操作必须保证stack非空,否则会编译错误
while(!s.empty())//遍历输出
{
cout<<s.top()<<"\t";
s.pop();
}
stack<string,list<float> > s1;//两个尖括号间一定要留空格
for(int i=0;i<10;i++)
{
s1.push(i+0.1);//stack的push压栈操作
}
cout<<"stack s1的大小为:"<<s1.size()<<endl; //size函数
cout<<"stack s1的top操作"<<s1.top()<<endl;
while(!s1.empty())
{
cout<<s1.top()<<"\t";
s1.pop();
}
return 0;
}
运行结果如下:
再来说说队列queue的基本操作吧,queue是一个受限制的deque,实现FIFO的功能(当然,还有个priority_queue优先队列可以实现优先级高的元素先出队的操作,其用法和queue基本相似),即只能队首删除元素,队尾插入元素。
操作包括尾部插入(push),首部弹出(pop),取队首元素引用(front),取队尾元素引用(back),获取队列空间大小(size),判空(empty)等基本用法。
# include<iostream>//queue的基本用法
# include<list>
# include<queue>
using namespace std;
int main()
{
queue<char,list<float> > s;
for(int i=1;i<11;i++)
s.push(i+0.1);//队尾插入元素
cout<<"队列的大小为:"<<s.size()<<endl;//队列的大小
cout<<"获取队尾元素:"<<s.back()<<endl;
cout<<"获取队首元素:"<<s.front()<<endl;
while(!s.empty())//队列判空
{
cout<<s.front()<<"\t";
s.pop();//队首弹出元素
}
return 0;
}
运行结果如下:
队列(优先队列)和栈的运用很多,如线程、响应申请、或是涉及排队理论的场合都可以运用,是很重要的数据结构类型之一。