本文介绍一个简单的环形队列的实现,由四部分组成:队列判空,队列判满,入队,出队。保证队列的基本属性FIFO的同时,通过加1取模
方法让队列变成环形。
基于数组的简单环形队列
#define SIZE 5 //宏控制数组的大小
int queue[SIZE] = {0}; //队列的存储空间为一个数组,队列的每个元素是一个int
int head = 0; //头索引
int tail = 0; //尾索引
队列判空
int is_empty()
{
return head == tail; // 头索引和尾索引相等,那么该队列为空,即队列里面没有存储int。
}
队列判满
int is_full()
{
return (tail+1)%SIZE == head; // 若尾索引+1的值 取模 SIZE 等于 头索引,则队列已满。
}
注意:由于这里采用了加1取模
方法,所以队列实际的容量为SIZE-1。例如,SIZE
的大小为5,实际能存储的int个数只有4个。
入队
int enqueue(int val)
{
if (is_full()) // step1: 队列判满
{
printf("queue is full...\n");
return 0;
}
// 队列未满
queue[tail] = val; // step2: 将val的值存储到queue[tail]中
tail = (tail+1)%SIZE; // step3: 尾索引循环加1
return 1;
}
出队
int dequeue(int *val)
{
if (is_empty()) // step1: 队列判空
{
printf("queue is empty...\n");
return 0;
}
// 队列不为空
*val = queue[head]; // step2: 将头索引指向的元素取出
head = (head+1)%SIZE; // step3: 头索引循环加1
return 1;
}
以上便是 基于数组的简单环形队列的实现。核心点在于理解加1取模
。本例可能在实际的工程中用不上,因为太过于简单,但是对于c语言初学者来说,有助于理解什么是队列、什么是环形队列、怎样实现一个环形队列。理解了核心思想后,便可以进一步扩展。
完整代码路径
https://gitee.com/yellow_mamba/c_tutorial/tree/master/ring_queue/v1.0
目录结构
|-- bin
|-- build
|-- CMakeLists.txt
|-- readme.md
`-- src
`-- simple_ring_queue.c
编译&运行
cd build
cmake ..
make
../bin/queue
QQ讨论群:679603305