队列-静态数组实现

队列和堆栈的顺序不同:队列是一种先进先出(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ocodotial

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值