队列是一种**先进先出(FIFO,First In First Out)**的线性数据结构。它只允许在队尾插入元素,在队头删除元素。生活中常见的银行排队、打印机任务列表都是队列的典型应用。
核心操作
在实际开发中,我们主要关注以下几个基础接口:
- 初始化:创建一个空队列,分配必要的内存或重置指针。
- 入队:将新元素添加到队尾。
- 出队:移除并返回队头元素。
- 获取队头:查看队头数据但不移除。
- 判空/判满:检查队列状态,防止非法操作。
- 销毁:释放队列占用的所有资源。
C 语言实现
1. 顺序队列(循环数组)
使用数组存储时,为了节省空间,通常采用'循环队列'的方式。关键在于利用取模运算让指针绕回数组头部,同时预留一个空间来区分'空'和'满'的状态。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// 顺序队列结构体
typedef struct {
int data[MAX_SIZE];
int front; // 队头指针(指向队头元素)
int rear; // 队尾指针(指向队尾元素的下一个位置)
} SeqQueue;
// 初始化队列
void InitQueue(SeqQueue *q) {
q->front = 0;
q->rear = 0;
}
// 判空
int IsEmpty(SeqQueue *q) {
return q->front == q->rear;
}
// 判满:预留一个空间区分空满
int IsFull(SeqQueue *q) {
return (q->rear + 1) % MAX_SIZE == q->front;
}
// 入队
int EnQueue {
(IsFull(q)) {
();
;
}
q->data[q->rear] = value;
q->rear = (q->rear + ) % MAX_SIZE;
;
}
{
(IsEmpty(q)) {
();
;
}
*value = q->data[q->front];
q->front = (q->front + ) % MAX_SIZE;
;
}
{
(IsEmpty(q)) {
();
;
}
*value = q->data[q->front];
;
}
{
SeqQueue q;
InitQueue(&q);
EnQueue(&q, );
EnQueue(&q, );
EnQueue(&q, );
frontVal;
GetFront(&q, &frontVal);
(, frontVal);
deVal;
DeQueue(&q, &deVal);
(, deVal);
GetFront(&q, &frontVal);
(, frontVal);
;
}


