C++ 队列详解
C++ 队列详解
一、队列的基本概念
队列(Queue)是一种线性数据结构,它遵循先进先出(First In First Out,简称FIFO)的原则。在队列中,新元素总是被添加到队尾,而旧元素则从队首移除。队列的实现通常使用两个指针,一个指向队首,另一个指向队尾。当队尾指针到达数组的末尾时,它将回到数组的开头,形成一个循环。
二、C++ 队列的实现原理
1. 初始化队列
为了实现队列,我们需要定义一个队列类,包含以下成员变量:
queue
:存储队列元素的数组;front
:指向队首元素的指针;rear
:指向队尾元素的指针。
初始化队列时,需要将 front
和 rear
指针都指向数组的第一个元素。
class Queue {
public:
int *queue;
int front, rear;
int size;
};
2. 入队操作
入队操作是指将元素添加到队列的尾部。首先,我们需要检查队列是否已满(即 size
是否等于队列的最大容量)。如果队列未满,我们可以将新元素添加到队尾,并更新 rear
指针。如果队列已满,我们需要将队尾元素移除,以便为新元素腾出空间。
void enqueue(Queue &q, int item) {
if (q.size == q.queueSize) { // 如果队列已满,移除队尾元素
q.dequeue();
}
q.queue[q.rear] = item; // 添加新元素到队尾
q.rear = (q.rear + 1) % q.queueSize; // 更新队尾指针
q.size++; // 更新队列大小
}
3. 出队操作
出队操作是指从队列的头部移除一个元素。首先,我们需要检查队列是否为空(即 front
是否等于 rear
)。如果队列为空,我们无法进行出队操作。如果队列不为空,我们可以将队首元素赋值给 front
指针,并将 front
指针向前移动一位。最后,我们需要更新队列的大小。
void dequeue(Queue &q) {
if (q.front == q.rear) { // 如果队列为空,无法进行出队操作
return;
}
q.queue[q.front] = -1; // 将队首元素设置为特殊值(例如 -1)表示已移除
q.front = (q.front + 1) % q.queueSize; // 更新队首指针
q.size--; // 更新队列大小
}
4. 获取队首元素和判断队列是否为空的操作省略,因为它们可以通过简单的条件语句实现。
三、算法流程及示例代码
下面是一个简单的示例,演示了如何使用上述实现的队列类进行入队和出队操作:
#include<bits/stdc++.h> // 引入标准库头文件
#define reg register // 定义寄存器宏
using namespace std; // 使用命名空间std
// 定义一个读取输入的函数read
inline int read(){
int x=0,f=1; // 初始化变量x和标志位f
char ch=getchar(); // 读取一个字符
while(ch<'0'||ch>'9'){ // 如果字符不是数字,则继续读取
if(ch=='-') f=-1; // 如果字符是负号,则将标志位设为-1
ch=getchar(); // 读取下一个字符
}
while(ch>='0'&&ch<='9'){ // 如果字符是数字,则将其转换为整数并累加到x中
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar(); // 读取下一个字符
}
return x*f; // 返回转换后的整数结果
}
// 定义一个输出函数write
void write(int x){
if(x<0){ // 如果x小于0,则先输出负号,再将x取绝对值
putchar('-');
x=-x;
}
if(x>9) write(x/10); // 如果x大于9,则递归调用write函数输出除个位数外的数
putchar(x%10+'0'); // 输出x的个位数
return ;
}
queue<int > a; // 定义一个整型队列a
int main(){
int n=read(); // 读取操作次数n
while(n--){ // 循环执行n次操作
int op=read(); // 读取操作类型op
if(op==1){ // 如果操作类型op为1,则读取一个整数x并将其入队
int x=read();
a.push(x);
}
else if(op==2){ // 如果操作类型op为2,则弹出队列头部元素(如果队列为空,则输出错误信息)
if(a.empty()){
printf("ERR_CANNOT_POP\n");
}
else{
a.pop();
}
}
else if(op==3){ // 如果操作类型op为3,则输出队列头部元素(如果队列为空,则输出错误信息)
if(a.empty()){
printf("ERR_CANNOT_QUERY\n");
}
else{
printf("%d\n",a.front());
}
}
else{ // 如果操作类型op为其他值,则输出队列的大小(即队列中元素的个数)
printf("%d\n",a.size());
}
}
return 0; // 程序正常结束,返回0
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)