C/C++知识点之循环队列
小标 2019-04-01 来源 : 阅读 1715 评论 0

摘要:本文主要向大家介绍了C/C++知识点之循环队列,通过具体的内容向大家展示,希望对大家学习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+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 2 不喜欢 | 0
看完这篇文章有何感觉?已经有2人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程