首页 > 其他 > 详细

循环队列

时间:2018-08-16 10:30:49      阅读:193      评论:0      收藏:0      [点我收藏+]
//循环队列
/*
循环队列需要注意的几点:
1.如果Q->front == Q->rear,则可以判断队列为空
2.如果 (Q->rear+1)%Q->maxsize 则可以判断队满
3.无论是对循环队列进行插入或者删除操作,均可能涉及到尾指针或者头指针的调整
(并且不是简单对指针进行+1操作)
Q->rear = (Q->rear+1) % Q->queuesize;//入队
Q->front = (Q->front+1) % Q->queuesize;//出队
4.循环队列的长度(Q->rear-Q->front+MAXQSIZE)%MAXQSIZE;
当Q->rear>Q->front时,循环队列的长度为Q->rear-Q->front
当Q->rear<Q->front时,循环队列的长度为Q->front-Q->front+MAXQSIZE
综合上述两种情况,得出循环队列长度的计算方法

    队列(包括循环队列)是一个逻辑概念,而链表是个存储概念。一个队列是否是循环队列
        不取决于它将采用何种存储结构,根据需要,循环队列可以采用链式存储结构,
        也可以采用链式存储结构(包括循环链表) 

*/
#include<stdio.h>
#include<malloc.h>

#define MAXQSIZE 50//最大队列长度
#define ERROR 0
#define OK 1

typedef int ElemType;
typedef int Status;

typedef struct{
ElemType *base;
int front;//头指针,若队列不空指向队头元素
int rear;//尾指针,若队列不空指向队列尾元素的下一个位置
int queuesize;
}SqQueue;

/
函数声明
/
Status InitQueue(SqQueue Q,int maxsize);
Status EnQueue(SqQueue
Q,ElemType e);
Status DeQueue(SqQueue Q);
Status Traverse(SqQueue
Q);
/
主函数
/
int main(void){
SqQueue Q;
InitQueue(&Q,MAXQSIZE);
for(int i = 0; i<10; i++){
EnQueue(&Q,i+2);
}
for(int i = 0; i<=10; i++){
DeQueue(&Q);
}
}

/
函数实现
/
//初始化队列
Status InitQueue(SqQueue Q,int maxsize){
Q->base = (ElemType
)malloc(MAXQSIZE*sizeof(ElemType));
if(!Q){
printf("初始化循环队列时分配空间失败!\n");
return ERROR;
}
Q->queuesize = maxsize;
Q->front = Q->rear = 0;
printf("初始化循环队列成功!\n");
return OK;
}

//入队
//判断队满的条件:
// 在循环队列中少用一个空间,当当前队尾指针指向位置+1之后%队列长度为队头指针位置表示队满
Status EnQueue(SqQueue *Q,ElemType e){
if((Q->rear+1) % Q->queuesize == Q->front){
printf("循环队列队满!\n");
return ERROR;
}
Q->base[Q->rear] = e;//将元素插入到队尾
printf("当前入队元素:%d\n",Q->base[Q->rear]);
Q->rear = (Q->rear+1) % Q->queuesize;
// Traverse(Q);
return OK;
}

//出队
Status DeQueue(SqQueue *Q){
//队列不空,删除队头元素
if(Q->front == Q->rear){
printf("当前队列为空,出队失败!\n");
return ERROR;
}
ElemType elem;
elem = Q->base[Q->front];
Q->front = (Q->front+1) % Q->queuesize;
printf("当前出队元素:%d\n",elem);
Traverse(Q);
return OK;
}

Status Traverse(SqQueue *Q){
if(Q->front == Q->rear){
printf("当前队列为空!\n");
return ERROR;
}
int p = Q->front;
printf("队列中的元素:");
while(p != Q->rear){
printf("-[%d]",Q->base[p++]);
}
printf("\n");
return OK;
}

循环队列

原文:http://blog.51cto.com/12012875/2160424

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!