//--------循环队列----队列的顺序存储结构-------
#define MAXQSIZE 100 //最大队列长度
typedef struct{
QElemType *base; //初始化的动态分配存储空间
int front; //头指针,若队列不为空,指向队列头元素
int rear; //为指针,若队列不为空,指向队列尾元素的下一个位置
}SqQueue;
//-----------循环队列的基本操作的算法描述-----------
Status InitQueue(SqQueue &Q){
//构造一个空队列Q
Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base)
exit(OVERFLOW); //存储分配失败
Q.front=Q.rear=0;
return OK;
}
int QueueLength(SqQueue Q){
//返回Q的元素个数,即队列的长度
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
Status EnQueue(SqQueue &Q,QElemType e){
//插入元素e为Q的新的队尾元素
if((Q.rear+1)%MAXQSIZE==Q.front)
return ERROR; //队列满
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
}
Status DeQueue(SqQueue &Q,QElemType &e){
//若队列不为空,则删除Q的对头元素,用e返回其值,并返回OK;
//否则返回ERROR
if(Q.front==Q.rear)
return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return OK;
}
循环队列程序示例:
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXQSIZE 6
typedef int Status;
typedef int QElemType;
typedef struct{
QElemType *base;
int front;
int rear;
}SqQueue;
Status EnQueue(SqQueue *Q,QElemType e){
if((Q->rear+1)%MAXQSIZE==Q->front)
return ERROR;
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXQSIZE;
return OK;
}
Status InitQueue(SqQueue *Q)
{
Q->base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
if (!Q->base)
exit(OVERFLOW);
Q->front = Q->rear = 0;
return OK;
}
Status PrintQueue(SqQueue Q){
int i;
printf("the queue is: ");
for(i=Q.front;i<Q.rear;i++){
printf("%d ", Q.base[i]);
}
return OK;
}
Status DeQueue(SqQueue *Q, QElemType *e){
if(Q->front==Q->rear)
return ERROR;
*e=Q->base[Q->front];
Q->front=(Q->front+1)%MAXQSIZE;
return OK;
}
int QueueLength(SqQueue Q){
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
int main(int argc,char *argv[]){
SqQueue queue;
QElemType e;
int i;
InitQueue(&queue);
printf("input:\n");
while(scanf("%d",&e)!=EOF)
EnQueue(&queue,e);
PrintQueue(queue);
printf("\n队列的长度为%d\n", QueueLength(queue));
printf("请输入出列的个数:");
scanf("%d", &i);
printf("出列的元素为:");
while(i!=0){
DeQueue(&queue, &e);
printf("%d ", e);
i--;
}
//printf("\n");
printf("\n队列的长度为%d\n", QueueLength(queue));
PrintQueue(queue);
printf("\n");
system("pause");
return 0
}
运行结果如下图(在visualstudio 2005中编译通过):