队列就是一个特殊的线性表。特殊在于队列只允许在队头删除元素,在队尾添加新元素。和我们生活中的排队是一个道理。
队列的一种实现方式是用数组,但是用数组就会出现队列“假满”的情况。
于是循环队列就诞生了。
这只是逻辑结构,数组在内存的物理结构是不变的。我们关心的正是逻辑结构
下面是关键的几点:
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);
}