摘要:本文主要向大家介绍了C/C++知识点之循环队列,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
本文主要向大家介绍了C/C++知识点之循环队列,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
//循环队列
/*
循环队列需要注意的几点:
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;
}
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号