在学习了栈这种先进后出(First in last out,也称FILO)的数据结构之后,我们来学习这种先进先出(First in first out,也称FIFO)的数据结构。
循环队列的储存结构相对链式队列要简单一些,是直接事先分配好一块空间,在有限的空间内进行数据的操作。起初队头指针和队尾指针都指向0位置,为了区别队列满状态,将队列中只剩一个空间时看做满状态。
队列满状态如下图:
具体代码实现:
(由于比较简单就不一块一块列了,直接贴代码,注释也比较详细)
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 40
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
//定义队列结构体
typedef struct{
ElemType data[MAXSIZE];
int front;//头指针位置
int rear;//尾指针位置
}SqQueue;
//初始化队列
Status InitQueue(SqQueue *Q)
{
Q->front = 0;
Q->rear = 0;
return OK;
}
//返回队列元素个数
int QueueLength(SqQueue Q)
{
return (Q.rear-Q.front + MAXSIZE)%MAXSIZE;
}
//入队操作
Status InQueue(SqQueue *Q, ElemType e)
{
if((Q->rear+1)%MAXSIZE == Q->front)//队列满
return ERROR;
Q->data[Q->rear] = e;
Q->rear = (Q->rear+1)%MAXSIZE;
return OK;
}
//出队操作
Status DeQueue(SqQueue *Q, ElemType *e)
{
if(Q->front == Q->rear)//队列为空
return ERROR;
*e = Q->data[Q->front];
Q->front = (Q->front+1)%MAXSIZE;
return OK;
}
int main()
{
SqQueue *Q;
Q = (SqQueue *)malloc(sizeof(SqQueue));
InitQueue(Q);
int i;
printf("将1~10入队...\n");
for(i=1; i<=10; i++)
{
InQueue(Q, i);
}
ElemType e;
printf("依次出队:");
for(i=0; i<MAXSIZE; i++)
{
if(DeQueue(Q, &e))
printf("%d ", e);
}
return 0;
}
程序运行结果: