c语言静态数组创建队列

    关于队列的接口名称并没有统一的约定,具体的方法也没有严格的限制,这里使用在队列头部删除,在队列尾部加入新元素的方法,

   关于接口的定义如下:

  •  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!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值