队列是一种先进先出的数据结构跟排队买票一样,顺序队列我们采用数组进行存储,在队列中有好几种定义的方式,根据定义的不同实现的代码也有一些小的差异,不管怎么变把握思想就行先搞懂一种,这里我们介绍其中的一种实现方式,在队列中经常用到%操作这可以防止下标溢出的操作很巧妙,比如%5那么得出的结果为0-4之间,下面有好几个这种操作自己拿一个短的数组跟着代码算下还是比较容易懂的,最后下标是从0开始算的。
需要注意的几个问题:
1、下面这种队列只能存储length-1个元素,最后一个位置我们不存元素
2、 (q->rear + 1) % MAXSIZE == q->front;//判断队列满
3、 q->rear = (q->rear + 1) % MAXSIZE; // 更新队尾指针
4、 q->front = (q->front + 1) % MAXSIZE;//更新队头指针
队列初始状态:
初始代码:
满队列状态:
检查队列是否满代码:
空队列状态:
空队列并不是说真的没有数据,实际储存的数据还在里面如下图,我们是通过移动指针进行逻辑上的删除、增加操作
入队操作:
出队操作:
完整代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 4 // 定义队列的最大容量
// 定义顺序队列结构体
typedef struct {
char data[MAXSIZE]; // 存储队列元素的数组
int front; // 队列的前端(队首)
int rear; // 队列的后端(队尾)
} SeqQueue;
// 初始化队列
void InitQueue(SeqQueue* q) {
q->front = 0; // 队列的前端初始化为0
q->rear = 0; // 队列的后端初始化为0
}
// 检查队列是否为空
int IsEmpty(SeqQueue* q) {
return q->front == q->rear;
}
// 检查队列是否已满
int IsFull(SeqQueue* q) {
return (q->rear + 1) % MAXSIZE == q->front;
}
// 入队操作
int Enqueue(SeqQueue* q, char item) {
if (IsFull(q)) {
printf("Queue is full!\n");
return -1; // 入队失败
}
q->data[q->rear] = item; // 将元素放入队尾
q->rear = (q->rear + 1) % MAXSIZE; // 更新队尾指针
return 0; // 入队成功
}
// 出队操作
int Dequeue(SeqQueue* q, char* item) {
if (IsEmpty(q)) {
printf("Queue is empty!\n");
return -1; // 出队失败
}
*item = q->data[q->front]; // 从队首获取元素
q->front = (q->front + 1) % MAXSIZE; // 更新队首指针
return 0; // 出队成功
}
// 打印队列中的所有元素
void PrintQueue(SeqQueue* q) {
if (IsEmpty(q)) {
printf("Queue is empty!\n");
return;
}
int i = q->front;
while (i != q->rear) {
printf("%c ", q->data[i]);
i = (i + 1) % MAXSIZE;
}
printf("\n");
}
// 测试顺序队列
int main() {
SeqQueue q;
char item;
// 初始化队列
InitQueue(&q);
// 测试入队
Enqueue(&q, 'A');
Enqueue(&q, 'B');
Enqueue(&q, 'C');
// 打印队列
PrintQueue(&q);
// 测试出队
if (Dequeue(&q, &item) == 0) {
printf("删除的队列元素为: %c\n", item);
}
// 打印队列
PrintQueue(&q);
return 0;
}