您的位置:首页 > 编程语言 > C语言/C++

静态数组实现队列(C语言)

2009-06-22 17:54 525 查看
概念:队列,FIFO(First in, first out),排队买票,先排的先买,插队的拉出去TJJ

实现:用静态数组实现,比起用链表实现来说,短小精悍,但无法动态更改队列的大小。

基本原理:两个变量front rear,作为数组的的下标,来引用队列中队首和对尾的值。

采用循环数组,其中的道理:入队,出队一直进行,下标一直往前移动,移动过后的的空间无法继续使用。

初始化的时候,保证front比rear大1即可。

代码(参考自《C和指针》):
/*
* 静态数组实现队列
* 优点:短小精悍
* 缺点:无法动态扩展大小
*
*/
#include "queue.h" /* 接口文件 */
#include <stdio.h>
#include <assert.h>
/* 数组长度比队列容量大1,是为了区分队列空和满的状态 */
#define QUEUE_SIZE    100
#define ARRAY_SIZE    (QUEUE_SIZE + 1)
/* queue[front-1] is always NULL */
static   QUEUE_TYPE     queue[ ARRAY_SIZE ];
static   size_t         front = 1;
static   size_t         rear = 0;
/*
*  front比rear大1的状态只有在未插入(即队列为空)的时刻才存在。
*  初始化时,只要front比rear大1,在ARRAY_SIZE范围内都可以随便取值。
*/
void insert( QUEUE_TYPE value )
{
assert( !is_full() );
rear = ( rear + 1 ) % ARRAY_SIZE;
queue[ rear ] = value;
}
void delete( void )
{
assert( !is_empty() );
front = ( front + 1 ) % ARRAY_SIZE;
}
QUEUE_TYPE first( void )
{
assert( !is_empty() );
return queue[ front ];
}
int is_empty( void )
{
/* 和初始化时front比rear大1对应 */
return ( rear + 1 ) % ARRAY_SIZE == front;
}
int is_full( void )
{
/* 为了区别队列空和满状态相等,设定了数组比队列容量大1
* 这样,当rear为QUEUE_SIZE(100)的时候,(rear+2) % ARRAY_SIZE(101)使判空的那一步不会执行 */
return ( rear + 2 ) % ARRAY_SIZE == front;
}
/* test it */
int main( void )
{
int i, value;
srand ( (unsigned int)time( NULL ) );
for( i = 0; i < 10; i++ ){
value = rand() % 100;
printf( "%d ", value );
insert( value );
}
putchar( '/n' );
for( i = 0; i < 10; i++ ){
printf( "%d ", first() );
delete();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: