第二讲. STL容器之队列与栈
1. STL容器
STL容器是C++中封装好的可以直接供用户使用的数据结构,它和数组有些类似,事实上很多STL也完全可以由数组模拟实现,但显然没有直接调用已经封装好的STL容器方便。除此之外,还有一个最大的特点是,STL容器是一种动态的容器,它的内存空间的分配是动态分配的,而不像数组,在声明的一开始就需要指明数组的容量大小。
2. 队列
2.1 简介
队列,顾名思义,就是一种模拟队伍或排队的数据结构,它的特点是先进先出,就是说每次从队列容器中取出的元素都是当前队伍的队首元素,每次插入到队列中的元素都是插到队尾,这就很像食堂吃饭时排队一样,后来的人不能插队,得到队伍末尾,每次食堂阿姨盛饭都是给队首的同学盛饭,然后队首的同学离开队伍。
出队<— x1 <— x2 <— x3 <— … <— xn-1 <— xn <— 入队
队首元素 队尾元素
2.2 头文件引入
#include <queue>
2.3 实例化对象
queue<T> Q;//声明一个元素类型为T的队列
其中,尖括号里的 T 表示队列中每一个元素的类型,可以是int、double、float、char等基本变量类型,也可以是用户自定义的struct结构体类型。
如定义一个以int为元素类型的队列Q:
queue<int> Q;
2.4 相关属性或方法
方法 | 返回类型 | 含义 |
---|---|---|
Q.front() | T | 返回队列的队首元素 |
Q.back() | T | 返回队列的队尾元素 |
Q.pop() | void | 队首元素出队,即删除最先进来的元素 |
Q.empty() | bool | 返回队列是否为空,true表示队列为空,false表示队列为非空 |
Q.size() | int | 返回队列的长度,即队列中元素的个数 |
其中,T表示队列中的元素类型。
2.5 代码例子
#include <iostream>
#include <queue>
using namespace std;
int main(){
queue<int> Q;//实例化一个队列对象,队列中的元素类型为int
cout<<Q.empty()<<endl;//输出1,因为此时队列为空
cout<<Q.size()<<endl;//输出0,此时队列中有0个元素
Q.push(1);//将int元素1插入队列 -> Q: 1
Q.push(2);//讲int元素2插入队列 -> Q: 1 2
cout<<Q.size()<<endl;//输出2,此时队列中有2个元素
cout<<Q.front()<<endl;//输出1,即此时的队首元素为1
Q.pop();//队首元素出队,即将元素1移除队列。 -> Q: 2
cout<<Q.front()<<endl;//输出2,即此时的队首元素为2
cout<<Q.size()<<endl;//输出1,即此时队列中有1个元素
Q.push(5);//将int元素5插入队列 -> Q: 2 5
cout<<Q.back()<<endl;//输出5,即此时的队尾元素为5
cout<<Q.size()<<endl;//输出2,此时队列中有2个元素
return 0;
}
3. 栈
3.1 简介
栈,是一种类似于叠盘子的数据结构,它的特点是后进先出,就是说每次从栈元素中取出的元素都是当前的栈顶元素,每次压入栈中的元素也是压入栈顶,这就很像一堆叠起来的盘子,只有先取走顶端的盘子,才能取下面的盘子,新的盘子要放进来也只能放到顶部,而不能插到中间或者底部。
这里贴上百度百科上的图供大家理解。
3.2 头文件引入
#include <stack>
3.3 实例化对象
和队列类似
stack<T> S;//声明一个元素类型为T的栈
其中,尖括号里的 T 表示队列中每一个元素的类型,可以是int、double、float、char等基本变量类型,也可以是用户自定义的struct结构体类型。
如定义一个以int为元素类型的栈S:
stack<int> S;
3.4 相关属性或方法
方法 | 返回类型 | 含义 |
---|---|---|
S.top() | T | 返回栈顶元素 |
S.pop() | void | 栈顶元素出栈,即删除最后进来的元素 |
S.empty() | bool | 返回栈是否为空,true表示栈为空,false表示栈为非空 |
S.size() | int | 返回栈的大小,即栈中元素的个数 |
其中,T表示队列中的元素类型。
3.5 代码例子
#include <iostream>
#include <stack>
using namespace std;
int main(){
stack<int> S;//实例化一个栈对象,队列中的元素类型为int
cout<<S.empty()<<endl;//输出1,因为此时栈为空
cout<<S.size()<<endl;//输出0,此时栈中有0个元素
S.push(1);//将int元素1压入栈 -> Q: 1
S.push(2);//讲int元素2压入栈 -> Q: 2 1
cout<<S.size()<<endl;//输出2,此时栈中有2个元素
cout<<S.top()<<endl;//输出2,即此时的栈顶元素为2
S.pop();//栈顶元素出栈,即将元素2移除栈。 -> Q: 1
cout<<S.top()<<endl;//输出1,即此时的栈顶元素为1
cout<<S.size()<<endl;//输出1,即此时栈中有1个元素
S.push(5);//将int元素5压入栈 -> Q: 5 1
cout<<S.size()<<endl;//输出2,此时栈中有2个元素
return 0;
}