用C语言实现一个循环队列并不难。关键点在于对队列 "空" 和 "满" 状态的判断。
正如《C和指针》中所描写的,有两种方法来实现对队列空和满状态的判断。
- 在数组中空一个元素不填,起始时, 置tail为0, front为1, 这样一来, 实现要浪费queue buffer中两个元素空间:
- 队列空: (tail+1) % queue_size == front
- 队列满: (tail+2) % queue_size == front
- 定义一个变量来记录队列中元素的个数, 判断队列的空和满直接看变量的值即可
本文中使用的是第2种:
#include <stdio.h>
#define QUEUE_SIZE 5
#define QUEUE_TYPE int
static int queue_cnt = 0;
static int queue_front = 0;
static int queue_tail = 0;
static QUEUE_TYPE queue_buf[QUEUE_SIZE];
int is_empty()
{
return queue_cnt == 0;
}
int is_full()
{
return queue_cnt == QUEUE_SIZE;
}
int insert(QUEUE_TYPE e)
{
if (is_full()) {
printf("queue is full!!!\n");
return 0;
}
queue_buf[queue_tail] = e;
queue_tail = (queue_tail + 1) % QUEUE_SIZE;
queue_cnt++;
return 1;
}
int delete()
{
if (is_empty()) {
printf("queue is empty!!!\n");
return 0;
}
queue_front = (queue_front + 1) % QUEUE_SIZE;
queue_cnt--;
return 1;
}
int main()
{
insert(3);
insert(3);
insert(3);
insert(3);
insert(3);
delete();
insert(3);
insert(3);
return 0;
}