概念:
“先进先出”,只能向队尾插入数据,从队头删除数据
分为链队列和循环队列
一般用STL queue或者手写静态数组实现队列
这里以链队列(普通队列)讲解
在STL库中可以 #include<queue> 进行调用
函数:
push() 在队尾插入一个元素
pop() 删除队列第一个元素
size() 返回队列中元素个数
empty() 如果队列空则返回true
front() 返回队列中的第一个元素
back() 返回队列中最后一个元素
clear() 清空队列
图示:
模板:
struct Queue{
int head=0,end=0;
int data[N]={0};
bool empty(){
return head==end;
}
int size(){
return end-head;
}
void pop(){
head++;
}
int front(){
return data[head];
}
int back(){
return data[end-1];
}
void push(int e){
data[end++]=e;
}
void clear(){
head=end=1;
}
};
模板题:
题1:
洛谷:B3616 【模板】队列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
代码:
/*---code---*/
const int N = 1e5 + 10;
struct Queue{
int head=0,end=0;
int data[N]={0};
bool empty(){
return head==end;
}
int size(){
return end-head;
}
void pop(){
head++;
}
int front(){
return data[head];
}
int back(){
return data[end-1];
}
void push(int e){
data[end++]=e;
}
void clear(){
head=end=1;
}
};
Queue q;
void solve(){
int n;cin>>n;
while(n--){
int op,x;
cin>>op;
if(op==1){
cin>>x;
q.push(x);
}else if(op==2){
if(q.empty())cout<<"ERR_CANNOT_POP\n";
else q.pop();
}else if(op==3){
if(q.empty())cout<<"ERR_CANNOT_QUERY\n";
else cout<<q.front()<<"\n";
}else{
cout<<q.size()<<"\n";
}
};
}
题2:
洛谷:P1540 [NOIP2010 提高组] 机器翻译 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
代码:
/*---code---*/
const int N = 1e5 + 10;
struct Queue{
int head=0,end=0;
int data[N]={0};
bool empty(){
return head==end;
}
int size(){
return end-head;
}
void pop(){
head++;
}
int front(){
return data[head];
}
int back(){
return data[end-1];
}
void push(int e){
data[end++]=e;
}
void clear(){
head=end=1;
}
};
int m,n,cnt;
Queue q;
int Hash[N]; //哈希表,查询是否已经在队列里存在了
void solve(){
cin>>m>>n;
while (n--) {
int x;cin >> x;
if (!Hash[x]) { //判断是否已经存在
cnt++; //不存在就加1
q.push(x); //加入队列
Hash[x] = 1; //标记已经查阅过
if (q.size()>m){ //如果内存已满就删去队头
Hash[q.front()] = 0;
q.pop();
}
}
}
cout<<cnt;
}
结尾:
其他数据结构以及算法模板关注专栏