题目

设以数组Q.elems[maxSize]存储循环队列的元素,同时以Q.rear和Q.length分别指示循环队列中的队尾位置和队列中所含元素的个数。试着给出该循环队列的队空条件和队满条件,并写出相应的入队(enQueue)和出队(deQueue)的操作。

分析

本题和普通的循环队列是不一样的,普通的循环队列是有两个指针的,即队头指针front和队尾指针rear,而本题中没有队头指针,因此出队的时候就需要根据已有的数据计算队头指针,来达到出队的目的。

  • 队空的条件是:Q.length==0
  • 队满的条件是:Q.length==maxSize

入队很简单,同普通的循环队列入队是一样的,需要注意的是注意Q.length的变化。

Q.rear=(Q.rear+1)%maxSize;// 移动指针
Q.elems[Q.rear]=x;// 入队元素
Q.length++;// 队列长度加1

出队是有些麻烦,因为没有队头指针,所以需要根据已有的信息计算队头指针,其核心语句如下:

x=Q.elems[(Q.rear-Q.length+1+maxSize)%maxSize];// 计算front的关键代码
Q.length--;// 出队后,队列长度减1 

而(Q.rear-Q.length+1+maxSize)%maxSize就是头指针,在循环队列中的下标。

代码

核心代码如下:

/* 入队 */
int enQueue(Queue &Q,int x) {/* 入队元素之前判断队列是否满队 */if(isQueueFull(Q)==1) {return 0;} else {Q.rear=(Q.rear+1)%maxSize;// 移动指针Q.elems[Q.rear]=x;// 入队元素Q.length++;// 队列长度加1return 1;}
}/* 出队 */
int deQueue_2(Queue &Q,int &x){if(Q.length==0){return 0;}
//  --(Q.length);// 参考代码是先减长度 x=Q.elems[(Q.rear-Q.length+1+maxSize)%maxSize];// 计算front的关键代码 Q.length--;// 出队后,队列长度减1 return 1;
}

完整代码:

#include<stdio.h>
#include<stdlib.h>#define maxSize 8typedef struct Queue {int elems[maxSize];int rear;// 循环队列的队尾位置int length;// 循环队列中所含元素的个数
} Queue;/* 初始化队列 */
void initQueue(Queue &Q) {Q.rear=0;Q.length=0;
}/* 判断是否循环队列队满,满队返回1,否则返回0 */
int isQueueFull(Queue Q) {if(Q.length==maxSize) { // 队满的条件是队列中元素个数等于maxSizereturn 1;}return 0;
}/* 判断是否循环队列队空,空队返回1,否则返回0 */
int isQueueEmpty(Queue Q) {if(Q.length==0) { // 队空的条件是队列的元素个数为0return 1;}return 0;
}/* 入队 */
int enQueue(Queue &Q,int x) {/* 入队元素之前判断队列是否满队 */if(isQueueFull(Q)==1) {return 0;} else {Q.rear=(Q.rear+1)%maxSize;// 移动指针Q.elems[Q.rear]=x;// 入队元素Q.length++;// 队列长度加1return 1;}
}/* 出队 */
int deQueue_2(Queue &Q,int &x){if(Q.length==0){return 0;}
//  --(Q.length);// 参考代码是先减长度 x=Q.elems[(Q.rear-Q.length+1+maxSize)%maxSize];// 计算front的关键代码 Q.length--;// 出队后,队列长度减1 return 1;
}/* 打印循环队列 */
void print(Queue Q){printf("打印循环队列如下:");while(Q.length!=0){printf("%d\t",Q.elems[(Q.rear-Q.length+1+maxSize)%maxSize]);Q.length--;}printf("\n");
}int main(){Queue Q;initQueue(Q);// 初始化队列/* 入队 */enQueue(Q,1); enQueue(Q,2); enQueue(Q,3); enQueue(Q,4); enQueue(Q,5); printf("\n");printf("入队元素:1,2,3,4,5\n");printf("循环队列的长度:%d\n",Q.length);printf("循环队列的队尾rear:%d\n",Q.rear);print(Q);/* 出队元素1 */int x;printf("\n");deQueue_2(Q,x);printf("出队元素:%d\n",x);printf("循环队列的长度:%d\n",Q.length);printf("循环队列的队尾rear:%d\n",Q.rear);print(Q);/* 出队元素2 */printf("\n");deQueue_2(Q,x);printf("出队元素:%d\n",x);printf("循环队列的长度:%d\n",Q.length);printf("循环队列的队尾rear:%d\n",Q.rear);print(Q); /* 再入队 */ enQueue(Q,6);enQueue(Q,7);enQueue(Q,8);enQueue(Q,9);printf("\n");printf("入队元素:6,7,8,9\n");printf("循环队列的长度:%d\n",Q.length);printf("循环队列的队尾rear:%d\n",Q.rear);print(Q);/* 再出队 */deQueue_2(Q,x);printf("\n");printf("出队元素:%d\n",x); printf("循环队列的长度:%d\n",Q.length);printf("循环队列的队尾rear:%d\n",Q.rear);print(Q);return 0;
}

运行结果如下:

考研数据结构之队列(3.3)——练习题之设以数组Q.elems[maxSize]存储循环队列的元素,同时以Q.rear和Q.length分别指示循环队列中的队尾位置和队列中所含元素的个数(C表示)相关推荐

  1. 以域变量rear和length分别指示循环队列中队尾元素的位置和内含元素的个数。给出队满条件和相应的如对和出队算法。

    以域变量rear和length分别指示循环队列中队尾 元素的位置和内含元素的个数.给出队满条件和相应的如对和出队算法. /* 以域变量rear和length分别指示循环队列中队尾 元素的位置和内含元素 ...

  2. Android系统中模拟GPS位置,Android系统中模拟GPS位置

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Android系统中提供了模拟GPS坐标的功能,可以很方便的帮助我们测试不同地理位置下应用中各个功能效果. 模拟器中模拟 ...

  3. 考研数据结构之循环队列

    提示:居上位而不骄,在下位而不忧.故乾坤因其时而惕,虽危无咎矣 文章目录 前言 一.循环队列 1.1定义 1.2 基本操作 1.3 判断条件 1.3.1 队空 1.3.2 队满 1.牺牲一个单元用来区 ...

  4. 考研数据结构名词解释

    第一章绪论 1.数据: 是描述客观事物得符号,是信息的载体,它是能够被计算机识别.存储和加工处理的对象.是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中被计算机程序处理的符号的总称,是计 ...

  5. python中的变量的引用_python中的变量引用小结

    python的变量都可以看成是内存中某个对象的引用.(变量指向该内存地址存储的值) 1.python中的可更改对象和不可更改对象 python中的对象可以分为可更改(mutable)对象与不可更改(i ...

  6. 408考研数据结构与算法之数组、链表、队列、栈知识点和算法详细教程(更新中)

    第一章:数据结构与算法概述 因为数据结构作为计算机专业的专业基础课程,是计算机考研的必考科目之一,如果打算报考计算机专业的研究生,你必须学好它. 数据结构是计算机软考.计算机等级考试等相关考试的必考内 ...

  7. 计算机队列概念,2020计算机专业考研数据结构知识点:栈、队列和数组

    2020计算机专业考研数据结构知识点:栈.队列和数组 1.栈.队列的定义及其相关数据结构的概念,包括:顺序栈.链栈.循环队列.链队列等.栈与队列存取数据(请注意包括:存和取两部分)的特点. 2. 掌握 ...

  8. 2022天勤考研数据结构笔记 第3章 栈和队列

    2022天勤考研数据结构笔记 第3章 栈和队列(更新中) 第3章 栈和队列 3.1 结构体定义 3.2 顺序栈 3.3 链栈 3.4 栈的应用 3.5 顺序队 3.6 链队 第3章 栈和队列 栈和队列 ...

  9. (王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀、中缀和后缀)

    前面我们就说过,栈是一种先进后出的线性表,这种先进后出的特性就决定了它在一类场合或问题中会经常被用到--递归.考研数据结构中所涉及的利用栈结构解决递归问题或者考察栈结构特性的问题主要有这么几类 括号匹 ...

  10. 【数据结构与算法】之深入解析“删除有序数组中的重复项”与“移除元素”的求解思路与算法示例

    删除有序数组中的重复项 一.题目要求 给你一个升序排列的数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度.元素的相对顺序应该保持 一致 . 由于在某些语言中不 ...

最新文章

  1. gpio pin和pad的区别
  2. 3年完成2款云端AI芯片研发量产,百度造芯为什么这么快?
  3. 学C++,80%都是为了搞竞赛、凑一门语言?网友:莫钓鱼
  4. bootstrap4 左侧导航栏 优秀 大气_志愿服务嘉年华|“持志隽永 赴愿奔行优秀志愿服务项目展示第六期...
  5. 基于python + tushare 的股票盯盘脚本
  6. GCD -- 倒计时
  7. (三)docker-compose 启动 Redis 服务
  8. 写在SDOI2016Round1前的To Do List
  9. junit 测试目录_JUnit 5测试中的临时目录
  10. linux 内核3.8,[Beaglebone] BBB迁移到linux 3.8实时内核
  11. python最优分箱计算iv值_GitHub - zhaoxingfeng/WOE: Weight of Evidence,基于iv值最大思想求最优分箱...
  12. 1296: [SCOI2009]粉刷匠
  13. python编程入门 适合于零基础朋友-《从零开始学 Python》(第二版)
  14. Python安装教程:
  15. linux-什么是Linux系统?linux详解Linux与Windows的区别Linux发行版本及特点介绍
  16. 使用安装Ubuntu和Win7双系统
  17. threejs制作3d模型展示网页
  18. IQ 域名被删除事件 的前因后果
  19. 秋招迟迟没消息?免笔试直通网易游戏的offer在这里!
  20. MATLAB App Designer入门实战(三)

热门文章

  1. 卡西欧 991CN X 计算器 简单使用方法
  2. 揭开docker的神秘面纱?镜像制作
  3. 更多 ViewBinding 的封装思路
  4. 朝花夕拾 - jsliang 大白前端新年庆
  5. Python NLPIR(中科院汉语分词系统)的使用 十五分钟快速入门与完全掌握
  6. 【LOJ 10064】黑暗城堡
  7. gz是什么意思饭圈_网络语BE是什么意思 饭圈用GE含义出处是哪里还有哪些类似表达...
  8. 粗糙集(Rough set) 理论
  9. 如何解决移动端300ms延迟的问题
  10. python后端需要什么基础_学习Python需要哪些基础知识?_后端开发