前言
唤我沈七就好啦。
这是模拟数据结构系列。
以下是之前同系列文章。
本次讲解的是队列。
因为队列和栈很类似,大家可以对比着去记。
什么是队列?
相关概念
队头:允许元素删除的一端。
队尾:允许元素插入的一端。
入队:队列的插入操作。
出队:队列的删除操作。
特点:先进先出。
即后面的元素需要等先进来的元素在队头出队后才能出队。
这是因为队列中的元素只能在队尾入队在队头出队,即入口只能入,出口只能出。可以通过下图来辅助理解。
队列也是线性表的一种,可以理解为仅能在两端插入和删除的数组。
实现思路
前面提到,队列可以理解为仅能在两端插入和删除的数组。而这正是我们实现思路。
实现方法
1 .创建变量
int qu[N]; 储存队列元素的数组 int hh=0; 队头 int tt=-1; 队尾 初始化很重要!!!
将队尾变量初始化为 -1 是为了方便最后判断队是否为空。
2 . 插入操作
if(a=="push") cin>>x; qu[++tt]=x; 元素只能在队尾入队
当输入 push 5 时 ,5这个元素就入队了。
注意这里一定要是 ++tt 让下标是0, 因为 tt 初始化的是 -1。
如果 tt++ 下标就是 - 1 了。
3 .删除操作
else if(a=="pop") hh++; 注意元素只能队头弹出,且是 ++
当输入 pop 5 时 ,5这个元素就出队了。
注意这里确实并没有真正删除放在队尾的元素,但队尾上升了一位,就可以理解为删除了下一位。
这里也不需要考虑空间浪费问题。
4 .判断队空
else if(a=="empty") 队内是否为空 { if(tt<hh) cout<<"YES"<<endl; else cout<<"NO"<<endl; }
因为 tt 初始化的时候是 -1,所以如果 tt << hh 就说明没有任何元素插入过。
当输入 empty 时 ,返回 YES队就为空 , 返回 NO 队就非空。
完整模板
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; int qu[N],hh=0,tt=-1;//初始化很重要!!! int main() { int n; cin>>n; while(n--) { int x; string a; cin>>a; if(a=="push") cin>>x,qu[++tt]=x;//元素只能队尾入队 else if(a=="pop") hh++;//注意元素只能队头弹出,且是 ++ else if(a=="empty")//队内是否为空 { if(tt<hh) cout<<"YES"<<endl; else cout<<"NO"<<endl; } else//查询队头 cout<<qu[hh]<<endl; } return 0; }
完结散花
ok以上就是对模拟数据结构之队列的全部讲解啦,很感谢你能看到这儿啦。如果有遗漏、错误或者有更加通俗易懂的讲解,欢迎小伙伴私信我,我后期再补充完善。