循环队列的实现

队列就是一个特殊的线性表。特殊在于队列只允许在队头删除元素,在队尾添加新元素。和我们生活中的排队是一个道理。

队列的一种实现方式是用数组,但是用数组就会出现队列“假满”的情况。





于是循环队列就诞生了。

这只是逻辑结构,数组在内存的物理结构是不变的。我们关心的正是逻辑结构

下面是关键的几点:

1.初始化

         front=rear=0;


2.   if(front==rear)

             return 1;    //为空

           else

            return 0;



3.满

       if(  (rear+1)   % QUEUESIZE == front )

             return 1    //满

      else

             return 0;

4.队中元素个数

       return (  rear-front+QUEUESIZE  ) % QUEUESIZE


具体实现代码:

# include <stdio.h>

# define QUEUESIZE 10   
                        //队列的容量 
 
typedef int DataType ;   

typedef struct queue{
	
	DataType data[QUEUESIZE];
	int front;
	int rear;
	
}Queue;


static void TraverseFunc(DataType tdata);

/***********队列ADT接口声明************/
void InitQueue(Queue *p);
int EnQueue(Queue *p,DataType tdata);
int DeQueue(Queue *p,DataType*pdata);
void TraverseQueue(Queue*p,void(*pfunc)(DataType));
unsigned int QueueLength(Queue *p);
int QueueIsFull(Queue *p);
int QueueIsEmpty(Queue*p);
/*************END*************/


int main (void)
{
	
	Queue test;
	InitQueue(&test);
	
	
	
	
	return 0;
} 


void InitQueue(Queue *p)
{
	
	p->front=p->rear=0;   
	
}

int EnQueue(Queue *p,DataType tdata)
{
	
	if(  (p->rear+1) %QUEUESIZE == p->front )
	  return 0;     //队列已满 
	
	p->data[p->rear]=tdata;
	p->rear=(p->rear+1)%QUEUESIZE;  //rear后移 

    return 1;	
}


int EeQueue(Queue *p,DataType*pdata)
{
	
	if(p->front==p->rear)
	   return 0;    //队列为空 
	
	*pdata=p->data[p->front];
	p->front=(p->front+1) % QUEUESIZE ; //front后移 
	
	return 1 ;

}

void TraverseQueue(Queue*p,void(*pfunc)(DataType))
{
	
	int i=p->front;
	
	while(i!=p->rear)
    {
    	
    	(*pfunc)(p->data[i]);
    	
    	i=(i+1)% QUEUESIZE ;      ///
    	
    	
    }
	
	
}

unsigned int QueueLength(Queue *p)
{
	
	
	return (p->rear - p->front + QUEUESIZE)% QUEUESIZE ;
	
}

int QueueIsFull(Queue *p)
{
	
	if(p->front==(p->rear+1)%QUEUESIZE)
	   return 1;
	
	 
    return 0;
}

int QueueIsEmpty(Queue*p)
{
	
	if(p->front==p->rear)
	   return 1;
	
	return 0;
}

static void TraverseFunc(DataType tdata)//遍历方法
{
	
	printf("%d\n",tdata);
	
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值