一、实现代码
#include <iostream>
#define MAXSIZE 100
using namespace std;
struct Queue {
int *data;
int front;
int rear;
Queue() { data = new int[MAXSIZE]; front = 0; rear = 0; }
//压入——rear+1
int push(int elem) {
if ((rear + 1) % MAXSIZE == front)
return -1;
else {
data[rear] = elem;
rear = (rear + 1) % MAXSIZE;
return 1;
}
}
//弹出——front+1
int pop() {
if (front == rear)
return -1;
else {
front = (front + 1) % MAXSIZE;
return 1;
}
}
//获取队头——返回data[front]
int Front() {
if (front == rear)
return -1;
else
return data[front];
}
//获取长度
int size() {
return (rear - front + MAXSIZE) % MAXSIZE;
}
};
int main(){
//1、申请队列
Queue q;
//2、压入元素
q.push(5);
q.push(2);
q.push(0);
//3、输出队列大小
cout << "The length of Queue is:" << q.size() << endl;
//4、弹出元素
while (q.size() != 0) {
cout << q.Front()<<'\t'; q.pop();
}
}
二、高频题目
225. 用队列实现栈
——压入一次另一个队列插入一次,交换队列(两个队列)
1、压入元素,将另一个队列元素插入,交换队列
2、弹出并返回存储队头,使用一个变量进行队头保存
3、获取栈顶,直接返回存储队头
4、判断是否为空,直接判断存储队列是否为空
——压入一次重新插入(一个队列)
1、压入元素,重新再插一遍前面的函数
2、弹出并返回队头,使用一个变量进行队头保存
3、获取栈顶,直接返回队头
4、判断是否为空,直接判断队列是否为空
346.数据流中的移动平均值——队列模拟窗口
1、压入元素q.push(next)
2、压入元素后窗口超过size,q.pop();sum=sum-front+next;
3、压入元素后窗口为超过size,sum+=next;
4、返回平均值,return double(sum/q.size());
281.Z字型迭代器——两个队列实现(注意向量同时为空的情况)
1、将两个向量放入两个队列
2、判断第一个向量是否为空,空则cur=1
3、根据cur判断弹出哪个队列头部
cur=0——弹出队列1,若队列2不为空,cur=1
cur=1——弹出队列2,若队列1不为空,cur=0
4、判断迭代器是否有next,两个队列有一个不为空即可
1429.第一个唯一数字——队列+哈希表
1、初始化——压入队列,哈希计数
2、返回唯一数字——不断弹出queue.front(),寻找map计数为1的元素
3、加入新数字——更新queue and hash
54. 螺旋矩阵——四指针圈遍历(不太属于队列题目)
1、获取矩阵行列信息
2、初始化四个指针 left right top bottom
3、进行圈遍历 右 下 左 上
4、左上加个条件,避免单行或单列重复扫描 if(left<right && top<bottom)
5、四个指针集体移动 ++left;--right; ++top; --bottom;
362.敲击计数器——队列加哈希表 first记录时间戳,second记录敲打次数
0、初始化计数表,sum=0
1、计数——队列不为空且队列尾部为该timestamp,是则哈希表计数+1,sum++
2、计数——否则,增加哈希表元素,并将敲打次数记为1,sum++
3、获取有限五分钟敲打次数——队列头与当时时间之差大于300s的弹出,sum–
三、STL中的队列
1、申请队列
queue<int> q;
2、压入元素
q.push(x);
3、弹出元素
q.pop();
4、获取队列头
q.front();
5、判断队列是否为空
q.empty();
6、获取队列大小
q.size();
7、交换两队列
swap(q1,q2);