C++ 队列详解

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 // 引入标准库头文件

#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 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

}

相关推荐

macbook下载的软件怎么安装(如何在macbook上安装下载的软件)
朱的偏旁
365bet在线手机版

朱的偏旁

📅 07-29 👁️ 3169
汽车摇号随机顺序码重要吗?
亚洲365世界杯

汽车摇号随机顺序码重要吗?

📅 08-20 👁️ 6283
当国家不存在时,你在世界杯上做个手势都不行
亚洲365世界杯

当国家不存在时,你在世界杯上做个手势都不行

📅 07-25 👁️ 1719
肯德基黄金鸡块炸几分钟
365bet在线手机版

肯德基黄金鸡块炸几分钟

📅 08-18 👁️ 1339
比较分析FGA富光FGA保温杯评测好不好?还是要看网友的评价!
巫师3狂猎steam应该购买哪一款
365bet在线手机版

巫师3狂猎steam应该购买哪一款

📅 08-29 👁️ 3075
邛崃全部美食推荐
亚洲365世界杯

邛崃全部美食推荐

📅 07-06 👁️ 2660
电脑机箱插线方法图解
亚洲365世界杯

电脑机箱插线方法图解

📅 08-20 👁️ 8428