欢迎各位看官^_^
目录
1.队列的定义
队列(Queue)是一种先进先出(First In First Out,FIFO)的线性数据结构,它只允许在队尾添加元素,在队头删除元素,不支持随机访问。队列常用的操作有入队(enqueue)、出队(dequeue)、队列长度(size)、队列是否为空(empty)等。队列可以用来实现很多算法,如广度优先搜索算法(BFS)和消息传递等。
2.队列的基本操作
2.1初始化队列
可以使用数组或链表来实现队列。对于数组,我们可以定义一个数组和两个指针(front和rear)来表示队列。对于链表,我们可以创建一个链表,并定义头节点指针和尾节点指针。队列是一种线性数据结构,可以用数组或链表来实现。
以下是用数组实现队列的C语言代码示例:
#include <stdio.h>
#define MAX_SIZE 100
int queue[MAX_SIZE];
int front = 0, rear = -1;
void enqueue(int data) {
if (rear == MAX_SIZE - 1) {
printf("Queue overflow\n");
} else {
rear++;
queue[rear] = data;
}
}
int dequeue() {
if (front > rear) {
printf("Queue underflow\n");
return -1;
} else {
int data = queue[front];
front++;
return data;
}
}
int main() {
enqueue(10);
enqueue(20);
enqueue(30);
printf("%d ", dequeue());
printf("%d ", dequeue());
printf("%d ", dequeue());
printf("%d ", dequeue());
return 0;
}
上述代码中,`queue`为数组,`front`和`rear`分别表示队列的前后指针,初始化为`0`和`-1`。`enqueue`函数用于向队列中添加元素,先判断队列是否已满,若未满则将数据存入队列尾部。`dequeue`函数用于弹出队列头部元素,先判断队列是否为空,若非空则返回队列头部元素并将`front`指针后移一位。在`main`函数中,先将元素10、20、30添加到队列中,然后依次弹出队列头部元素并输出。
2.2判断队列是否为空
如果队列为空,则front和rear指向同一个位置。
// 判断队列是否为空
int is_empty() {
return front == rear;
}
2.3判断队列是否已满
如果队列已满,则rear指向的下一个位置就是front(因为它是循环队列)。
// 判断队列是否已满
int is_full() {
return (rear + 1) % MAX_SIZE == front;
}
2.4入队
当队列不满时,我们将元素插入队列的rear位置,并将rear指针后移。
// 入队
void enqueue(int data) {
if (is_full()) {
printf("Queue is full.\n");
return;
}
queue[rear] = data;
rear = (rear + 1) % MAX_SIZE;
}
2.5出队
当队列不为空时,我们将front指向的元素从队列中删除,并将front指针后移。
// 出队
int dequeue() {
if (is_empty()) {
printf("Queue is empty.\n");
return -1;
}
int data = queue[front];
front = (front + 1) % MAX_SIZE;
return data;
}
2.6完整代码
#include <stdio.h>
#define MAX_SIZE 10 // 定义队列的最大容量为10
int queue[MAX_SIZE]; // 定义数组队列
int front = 0, rear = 0; // front指向队首,rear指向队尾的下一个位置
// 判断队列是否为空
int is_empty() {
return front == rear;
}
// 判断队列是否已满
int is_full() {
return (rear + 1) % MAX_SIZE == front;
}
// 入队
void enqueue(int data) {
if (is_full()) {
printf("Queue is full.\n");
return;
}
queue[rear] =