关于队列的接口名称并没有统一的约定,具体的方法也没有严格的限制,这里使用在队列头部删除,在队列尾部加入新元素的方法,
关于接口的定义如下:
- insert() 表示插入到队列头部
- delete() 表示从队列尾部删除数组
- is_full() 判断队列是否为满
- is_empty() 判断队列是否为空
- first() 获得队列的头部元素
- last() 获得队列尾部元素
- queue_size() 获得已使用队列的长度
queue.h
#ifndef QUEUE_H
#define QUEUE_H
#include <stdio.h>
#define QUEUE_TYPE int /*define the type of the queue*/
/*
* create queue
* only for dynamic_shuzu_queue
*/
void create_queue(size_t size);
/*
* destory_queue
* only for list_queue and dynamic_shuzu_queue
*/
void destory_queue(void);
//insert
void insert(QUEUE_TYPE value);
//delete
void delete(void);
//first
QUEUE_TYPE first(void);
//last
QUEUE_TYPE last(void);
//queue_size
int queue_size(void);
//is_empty
int is_empty(void);
//is_full
int is_full(void);
#endif /*QUEUE_H*/
queue.c
#include <stdio.h>
#include "queue.h"
#include <assert.h>
/*
* 使用循环数组带来了队列空与队列满时front和rear相同的问题
* 解决方法一:定一个变量queue_size用来记录数据的长度
*
* 解决方法二:使用循环数组不填满的技术,保持数组中始终有一个元素不使用,rear从比front小1的位置开始,最大到循环位置中front的前2个位置
* 即:空为(rear+1)%QUEUE_SIZE==front 满为(rear+2)%QUEUE_SIZE==front
*/
#define QUEUE_SIZE 10
#define ARRAY_SIZE (QUEUE_SIZE+1)
static QUEUE_TYPE queue[ARRAY_SIZE];
static int front=1;
static int rear=0;
//insert
void insert(QUEUE_TYPE value)
{
assert(!is_full());
rear=(++rear)%ARRAY_SIZE;
queue[rear]=value;
}
//delete
void delete(void)
{
assert(!is_empty());
front=(++front)%ARRAY_SIZE;
}
//first
QUEUE_TYPE first(void)
{
assert(!is_empty());
return queue[front];
}
//last
QUEUE_TYPE last(void)
{
assert(!is_empty());
return queue[rear];
}
//queue_size
int queue_size(void)
{
if(is_empty())
{
return 0;
}
else if(rear>=front)
{
return rear+1-front;
}
else
{
return ARRAY_SIZE-front+rear+1;
}
}
//is_empty
int is_empty(void)
{
return (rear+1)%ARRAY_SIZE==front;
}
//is_full
int is_full(void)
{
return (rear+2)%ARRAY_SIZE==front;
}
queuetest.h
/*
* 测试循环数组队列
*/
#include <stdio.h>
#include "queue.h"
void main()
{
int i=0;
for(i=1;i<=11;i++)
{
printf("queue size: %2ld\n",queue_size());
if(is_full())
{
printf("the queue is full now!\n");
break;
}
insert(i);
printf("front : %2ld\trear: %2ld \n",first(),last());
}
for(i=1;i<=11;i++)
{
printf("queue size: %2ld\n",queue_size());
if(is_empty())
{
printf("the queue is empty now!\n");
break;
}
printf("front : %2ld\trear: %2ld \n",first(),last());
delete();
}
}
运行编译命令: gcc -o queuetest queue.c queuetest.c
运行结果:
queue size: 0
front : 1 rear: 1
queue size: 1
front : 1 rear: 2
queue size: 2
front : 1 rear: 3
queue size: 3
front : 1 rear: 4
queue size: 4
front : 1 rear: 5
queue size: 5
front : 1 rear: 6
queue size: 6
front : 1 rear: 7
queue size: 7
front : 1 rear: 8
queue size: 8
front : 1 rear: 9
queue size: 9
front : 1 rear: 10
queue size: 10
the queue is full now!
queue size: 10
front : 1 rear: 10
queue size: 9
front : 2 rear: 10
queue size: 8
front : 3 rear: 10
queue size: 7
front : 4 rear: 10
queue size: 6
front : 5 rear: 10
queue size: 5
front : 6 rear: 10
queue size: 4
front : 7 rear: 10
queue size: 3
front : 8 rear: 10
queue size: 2
front : 9 rear: 10
queue size: 1
front : 10 rear: 10
queue size: 0
the queue is empty now!