队列
本文使用c语言完成队列这种数据结构的编码,关于队列数据结构的基本概念和术语可以参考之前的文章:[juejin.cn/post/727522… -- 队列)
1. 队列中的方法
initQueue(Queue *queue)方法用于初始化队列。它将队列的前端指针front和后端指针rear都设置为-1,表示队列为空。
// 初始化队列
void initQueue(Queue *queue) {
queue->front = -1;
queue->rear = -1;
}
isEmpty(Queue *queue)方法用于判断队列是否为空。如果队列的前端指针front和后端指针rear都等于-1,则表示队列为空,返回1;否则返回0。
// 判断队列是否为空
int isEmpty(Queue *queue) {
return (queue->front == -1 && queue->rear == -1);
}
isFull(Queue *queue)方法用于判断队列是否已满。通过计算(queue->rear + 1) % MAX_SIZE来确定下一个位置是否和前端指针front相同。如果相同,则表示队列已满,返回1;否则返回0。
// 判断队列是否已满
int isFull(Queue *queue) {
return (queue->rear + 1) % MAX_SIZE == queue->front;
}
enqueue(Queue *queue, int item)方法用于将元素入队。首先判断队列是否已满,如果已满则无法入队,直接返回。然后根据当前的后端指针rear的位置将元素放入队列中,并更新rear的值。
void enqueue(Queue *queue, int item) {
if (isFull(queue)) {
printf("Queue is full. Cannot enqueue.\n");
return;
}
if (isEmpty(queue)) {
queue->front = 0;
queue->rear = 0;
} else {
queue->rear = (queue->rear + 1) % MAX_SIZE;
}
queue->data[queue->rear] = item;
}
dequeue(Queue *queue)方法用于将队首元素出队。首先判断队列是否为空,如果为空则无法出队,直接返回。然后根据当前的前端指针front的位置将元素从队列中取出,并更新front的值。
int dequeue(Queue *queue) {
if (isEmpty(queue)) {
printf("Queue is empty. Cannot dequeue.\n");
return -1;
}
int item = queue->data[queue->front];
if (queue->front == queue->rear) {
// 队列中只有一个元素
queue->front = -1;
queue->rear = -1;
} else {
queue->front = (queue->front + 1) % MAX_SIZE;
}
return item;
}
int front(Queue *queue)方法用于获取队列首元素,基本上与dequeue方法相同,但是队首元素不出队列,只返回其值,前端指针也不用移动位置。
int front(Queue *queue) {
if (isEmpty(queue)) {
printf("Queue is empty. No front element.\n");
return -1;
}
return queue->data[queue->front];
}
2. 实现代码
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int front;
int rear;
} Queue;
// 初始化队列
void initQueue(Queue *queue) {
queue->front = -1;
queue->rear = -1;
}
// 判断队列是否为空
int isEmpty(Queue *queue) {
return (queue->front == -1 && queue->rear == -1);
}
// 判断队列是否已满
int isFull(Queue *queue) {
return (queue->rear + 1) % MAX_SIZE == queue->front;
}
// 入队操作
void enqueue(Queue *queue, int item) {
if (isFull(queue)) {
printf("Queue is full. Cannot enqueue.\n");
return;
}
if (isEmpty(queue)) {
queue->front = 0;
queue->rear = 0;
} else {
queue->rear = (queue->rear + 1) % MAX_SIZE;
}
queue->data[queue->rear] = item;
}
// 出队操作
int dequeue(Queue *queue) {
if (isEmpty(queue)) {
printf("Queue is empty. Cannot dequeue.\n");
return -1;
}
int item = queue->data[queue->front];
if (queue->front == queue->rear) {
// 队列中只有一个元素
queue->front = -1;
queue->rear = -1;
} else {
queue->front = (queue->front + 1) % MAX_SIZE;
}
return item;
}
// 获取队头元素
int front(Queue *queue) {
if (isEmpty(queue)) {
printf("Queue is empty. No front element.\n");
return -1;
}
return queue->data[queue->front];
}
// 测试队列数据结构
int main() {
Queue queue;
initQueue(&queue);
enqueue(&queue, 10);
enqueue(&queue, 20);
enqueue(&queue, 30);
printf("Front: %d\n", front(&queue)); // 10
int item = dequeue(&queue);
printf("Dequeued item: %d\n", item); // 10
printf("Front: %d\n", front(&queue)); // 20
return 0;
}