C++ 队列详解

C++ 队列详解

一、队列的基本概念

队列(Queue)是一种线性数据结构,它遵循先进先出(First In First Out,简称FIFO)的原则。在队列中,新元素总是被添加到队尾,而旧元素则从队首移除。队列的实现通常使用两个指针,一个指向队首,另一个指向队尾。当队尾指针到达数组的末尾时,它将回到数组的开头,形成一个循环。

二、C++ 队列的实现原理

1. 初始化队列

为了实现队列,我们需要定义一个队列类,包含以下成员变量:

  • queue:存储队列元素的数组;
  • front:指向队首元素的指针;
  • rear:指向队尾元素的指针。

初始化队列时,需要将 frontrear 指针都指向数组的第一个元素。

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
}
posted @ 2023-08-18 20:50  Nebulary  阅读(734)  评论(0编辑  收藏  举报