循环队列:把头尾相接的顺序存储结构称为循环队列
逻辑结构如图:
编译环境vc6.0,代码如下:
/*
保留一个空间来区分队空和队满
队满时:(Q.rear+1)%MaxSize==Q.front
初始时(队空):Q.front=Q.rear=0
队首指针进1:Q.front=(Q.front+1)%MaxSize
队尾指针进1:Q.rear=(Q.rear+1)%MaxSize
队列长度:(Q.rear+MaxSize-Q.front)%MaxSize
出队入队时:指针都是顺时针方向进1
*/
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
//顺序队列存储结构
typedef struct
{
int data[MaxSize]; //存放队列元素
int front, rear; //队头指针和队尾指针
}SqQueue;
//****************************初始化**************************
int InitQueue(SqQueue* Q)
{
Q->rear = Q->front = 0;
return 1;
}
//****************************判断是否为空**************************
int isEmpty(SqQueue Q)
{
if (Q.rear == Q.front)
return 1;
else return 0;
}
//****************************入队**************************
int EnQueue(SqQueue* Q, int e)
{
if ((Q->rear + 1) % MaxSize == Q->front) //队满
return 0;
Q->data[Q->rear] = e; //将元素e赋值给队尾
Q->rear = (Q->rear + 1) % MaxSize; //rear指针后移,若到最后则转到数组头部
return 1;
}
//****************************出队**************************
int DeQueue(SqQueue* Q, int* e)
{
if (Q->rear == Q->front) //队空
return 0;
*e = Q->data[Q->front]; //对头元素赋值给e
Q->front = (Q->front + 1) % MaxSize; //front指针后移,若到最后则转到数组头部
return 1;
}
//********************求顺序表长度*********************
int QueueLength(SqQueue Q)
{
return (Q.rear + MaxSize - Q.front) % MaxSize;
}
int main()
{
int i, e, n; //e入队元素,n入队元素个数
SqQueue Q;
InitQueue(&Q); //初始化测试
printf("初始化成功\n");
if (isEmpty(Q))
printf("队列为空\n");
else printf("队列不为空\n");
printf("请输入入队元素个数\n"); //入队测试
scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("请输入第%d个元素值", i + 1);
scanf("%d", &e);
if (EnQueue(&Q, e))
printf("入队成功\n");
else printf("入队失败\n");
}
if (DeQueue(&Q, &e)) //出队测试
printf("\n元素%d出队\n", e);
else printf("出队失败\n");
printf("链表长度为%d\n", QueueLength(Q));
return 0;
}
测试案例: