队列和堆栈的顺序不同:队列是一种先进先出(First-IN FIRST-OUT,FIFO)的结构。排队就是一种典型的队列。首先轮到的是排在队伍最前面的人,新入队的人总是排在队伍的最后。
队列的接口:[$queue.h ]
/**
* 和堆栈不同,在队列中,用于执行元素的插入和删除的函数并没有被普遍接受的名字,
* 所以我们使用insert和delete_这两个名字。同样,对于插入应该在队列的头部还是尾部也咩有完全
* 一致的意见。从原则上说,你在队列的哪一端插入并没有区别。但是,在队列的尾部插入以及在头部
* 删除更容易记忆一些,因为它准确地描述了人们在排队时的实际体验
*
*
* 在传统的接口中,delete_函数从队列的头部删除一个元素并且将其返回。在另外一个接口中,delete
* 函数从队列的头部删除一个元素,但是不返回它。first函数返回队列第一个元素的值但不将它从队列中删除
*
* 本程序定义了后面那种接口。它包括链式和动态分配实现的队列需要使用的create_queue和
* destroy_queue函数的原型
*/
/**
* 一个队列模块的接口
*/
#include <stdlib.h>
#define QUEUE_TYPE int //队列元素的类型
/**
* create_queue
*
* 创建一个队列,参数指定队列可以存储的元素的最大数量
* 注意:这个函数只适用于使用动态分配数组的队列
*/
void create_queue(size_t size);
/**
* destroy_queue
* 销毁一个队列。注意:这个函数只适用于链式和动态分配数组的队列
*/
void destroy_queue();
/**
* insert
* 向队列添加一个新元素,参数就是需要添加的元素
*/
void insert(QUEUE_TYPE value);
/**
* delete
* 从队列中移除一个元素并且将其丢弃
*/
void delete_();
/**
* first
* 返回队列中第一个元素的值,但不修改队列本身
*/
QUEUE_TYPE first();
/**
* is_empty
* 如果队列为空,返回1,否则返回0
*/
int is_empty();
/**
* is_full
* 如果队列已满,返回1,否则返回0
*/
int full();
静态数组实现队列的源程序:[a_queue.c]
/**
* 用一个静态数组实现一个队列。它使用“不完全填满数组”的技巧来区分空队列和满队列
*/
/**
* 一个用静态数组来实现的队列。数组的长度只能通过修改#define定义并重新编译模块来调整
*/
#include "queue.h"
#include <stdio.h>
#include <assert.h>
#define QUEUE_SIZE 100 //队列中元素的最大数量
#define ARRAY_SIZE (QUEUE_SIZE + 1) //数组的长度
/**
* 用于存储队列元素的数组和执行队列头和尾的指针
*/
static QUEUE_TYPE queue[ARRAY_SIZE];
static size_t front = 1;
static size_t rear = 0;
/**
* insert
*/
void insert(QUEUE_TYPE value)
{
assert(!is_full());
rear = (rear + 1) % ARRAY_SIZE;
queue[rear] = value;
}
/**
* delete
*/
void delete_()
{
assert(!is_empty());
front = (front + 1) % ARRAY_SIZE;
}
/**
* first
*/
QUEUE_TYPE first()
{
assert(!is_empty());
return queue[front];
}
/**
* is_empty
*/
int is_empty()
{
return (rear + 1) % ARRAY_SIZE == front;
}
/**
* is_full
*/
int is_full()
{
return (rear + 2) % ARRAY_SIZE == front;
}