王道考研数据结构--4.2循环队列

这篇具有很好参考价值的文章主要介绍了王道考研数据结构--4.2循环队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言 

1.循环队列的定义

2.循环队列的结构

3.循环队列的操作

3.1定义循环队列

3.2初始化

3.3入队

3.4出队

3.5遍历,求表长

3.6清空销毁

4.完整代码


前言 

日期:2023.7.25

书籍:2024年数据结构考研复习指导(王道考研系列)

内容:实现顺序队列的基本实现,主要功能如下:
1.循环队列的数据结构
2.入队
3.出队
4.遍历
5.求队长

6.清空,销毁

1.循环队列的定义


         顺序队列在使用过程中容易出现虚假的满状态, 为了解决这个问题,就产生了一个较巧妙的方法,将顺序队列臆造为一个环状的空间,称之为循环队列。

        循环队列中指针和队列元素之间的关系不变,我们只需要利用模运算就可以很容易实现指针的循环移动。但是循环队列中存在一个问题,在循环队列中只凭头指针front等于尾指针rear无法判别队列空间是“空”还是“满”,可有两种处理方法:其一是另设一个标志位以区别队列是“空”还是“满”;其二是少用一个元素空间,约定以“队列头指针在队列尾指针的下一位置(指环状的下一位置)上”作为队列呈“满”状态的标志。此处使用方法二来解决这个问题。

2. 循环队列的结构

3.循环队列的操作

3.1定义循环队列

#define MaxSize 50
typedef int ElemType;
typedef struct Queue{
	ElemType data[MaxSize]; //指向队列的存储空间
	int       front; //指向队头
	int       rear;  //指向队尾
}Queue;

3.2初始化

//1.初始化
void InitQueue(Queue *Q){
	Q->front = Q->rear = 0;
}

3.3入队

//入队操作
bool EnQueue(Queue *Q, ElemType x){
	//判断循环队列是否已满
	if(((Q->rear+1)%MaxSize) == Q->front)
		return false;
	//如果还有存储空间,将数据入队
	Q->data[Q->rear] = x;
    Q->rear = (Q->rear+1)%MaxSize;
    return true;
}

3.4出队

//3.出栈
//出队
bool DeQueue(Queue *Q,ElemType *x){
	//判断队列中的元素是否为空
	if(Q->front == Q->rear)
		return false;
	//如果队列中的元素不为空,进行出队操作
    *x=Q->data[Q->front];
	Q->front = (Q->front+1)%MaxSize;
    return true;
}

3.5遍历,求表长

//4.遍历队列
//打印顺序队列中的元素
bool ShowQueue(Queue *Q){
	//遍历队头到队尾中的每个元素,并将其打印输出
	for(int i=Q->front; i<Q->rear; ){
		printf("%d ",Q->data[i]);
        i = (i+1)%MaxSize;
	}
	printf("\n");
    return true;
}

//5.求队长
//获取队列元素个数
int Length(Queue *Q){
	//将尾指针位置减去头指针的位置就是队列中元素的个数
	//计算尾指针位置与头指针位置的差距
	int len= Q->rear - Q->front;
	//如果为正数,那么len就是队列的长度;如果为负数,那么MAXSIZE+len才是队列的长度
	len = (len>0) ? len : MaxSize+len;
	return len;
}

3.6清空销毁


//6.清空,销毁队列
//清空队列
bool ClearQueue(Queue *Q){
	//将队头指针和队尾指针都重置为0
	Q->front = Q->rear = 0;
    return true;
}
//销毁队列
void DestroyQueue(Queue *Q){
	//释放队列的存储空间
	free(Q);
	//将队列空间的位置指针置空
	Q = NULL;
}

4.完整代码

//循环队列
#include <stdio.h>
#include <stdlib.h>

#define bool char
#define true 1
#define false 0


#define MaxSize 50
typedef int ElemType;
typedef struct Queue{
	ElemType data[MaxSize]; //指向队列的存储空间
	int       front; //指向队头
	int       rear;  //指向队尾
}Queue;

//1.初始化
void InitQueue(Queue *Q){
	Q->front = Q->rear = 0;
}

//2.入队
//入队操作
bool EnQueue(Queue *Q, ElemType x){
	//判断循环队列是否已满
	if(((Q->rear+1)%MaxSize) == Q->front)
		return false;
	//如果还有存储空间,将数据入队
	Q->data[Q->rear] = x;
    Q->rear = (Q->rear+1)%MaxSize;
    return true;
}
//3.出栈
//出队
bool DeQueue(Queue *Q,ElemType *x){
	//判断队列中的元素是否为空
	if(Q->front == Q->rear)
		return false;
	//如果队列中的元素不为空,进行出队操作
    *x=Q->data[Q->front];
	Q->front = (Q->front+1)%MaxSize;
    return true;
}
//4.遍历队列
//打印顺序队列中的元素
bool ShowQueue(Queue *Q){
	//遍历队头到队尾中的每个元素,并将其打印输出
	for(int i=Q->front; i<Q->rear; ){
		printf("%d ",Q->data[i]);
        i = (i+1)%MaxSize;
	}
	printf("\n");
    return true;
}

//5.求队长
//获取队列元素个数
int Length(Queue *Q){
	//将尾指针位置减去头指针的位置就是队列中元素的个数
	//计算尾指针位置与头指针位置的差距
	int len= Q->rear - Q->front;
	//如果为正数,那么len就是队列的长度;如果为负数,那么MAXSIZE+len才是队列的长度
	len = (len>0) ? len : MaxSize+len;
	return len;
}

//6.清空,销毁队列
//清空队列
bool ClearQueue(Queue *Q){
	//将队头指针和队尾指针都重置为0
	Q->front = Q->rear = 0;
    return true;
}
//销毁队列
void DestroyQueue(Queue *Q){
	//释放队列的存储空间
	free(Q);
	//将队列空间的位置指针置空
	Q = NULL;
}



int main(){
	Queue Q;
	InitQueue(&Q);

	for(int i=1; i<=15; ++i){
		EnQueue(&Q, i);
	}
	ShowQueue(&Q);
    int x;
	DeQueue(&Q,&x);
    printf("%d\n",x);
	EnQueue(&Q,100);
	ShowQueue(&Q);
    printf("%d\n",Length(&Q));
}

王道考研数据结构--4.2循环队列,数据结构,考研,数据结构

 文章来源地址https://www.toymoban.com/news/detail-606118.html

到了这里,关于王道考研数据结构--4.2循环队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【王道考研】王道数据结构与算法详细笔记(全)

    目录 第一章 数据结构绪论  1.1 数据结构的基本概念 1.2 数据结构的三要素 1.2.1. 数据的逻辑结构 1.2.2. 数据的存储结构(物理结构) 1.2.3. 数据的运算 1.2.4. 数据类型和抽线数据类型 1.3 算法的基本概念 1.4 算法的时间复杂度 1.5 算法的空间复杂度 第二章 线性表 2.1 线性表的定

    2024年02月08日
    浏览(52)
  • 王道考研数据结构--2.单链表

    1.前言 2.难点 2.1c和c++的引用转换 2.2引入头结点的好处 2.3头插法和尾插法 3.代码段 3.1C语言自定义bool操作 3.2单链表结构体定义 3.3创建新节点 3.4头插法和尾插法 3.5查找 3.6按位序插入 3.7后插和前插 3.8删除 3.9求表长 3.10遍历输出单链表 4.完整代码 日期:2023.6.21 书籍:2024年数据

    2024年02月09日
    浏览(115)
  • 【数据结构】24王道考研笔记——串

    串(字符串)是由零个或多个字符组成的有限序列。 子串:串中任意个连续的字符组成的子序列 主串:包含子串的串 字符在主串中的位置:字符在串中的序号 子串在主串中的位置:子串的第一个字符在主串中的位置 串的基本操作: 其中串执行比较操作时,从第一个字符开

    2024年02月15日
    浏览(72)
  • 数据结构笔记(王道考研) 第一章:绪论

    大部分内容基于中国大学MOOC的2021考研数据结构课程所做的笔记,该课属于付费课程(不过盗版网盘资源也不难找。。。)。后续又根据23年考研的大纲对内容做了一些调整,将二叉排序树和平衡二叉树的内容挪到了查找一章,并增加了并查集、平衡二叉树的删除、红黑树的内

    2024年02月14日
    浏览(49)
  • 【数据结构】24王道考研笔记——图

    图的定义 有向图以及无向图 简单图以及多重图 度 顶点-顶点间关系 连通图、强连通图 子图 (有向图也一样) 连通分量 强连通分量 生成树 生成森林 边的权、带权网/图 特殊形态的图 总结: 邻接矩阵 存储带权图(网): 对角线处可以填0或∞ 空间复杂度为O(|V| 2 )只和顶

    2024年02月17日
    浏览(49)
  • 【数据结构】| 王道考研——树的前世今生

    根据王道考研数据结构总结出的知识点,以下是文章整体大纲: 1.1 概念 树是n个结点的有限集合,n = 0时称为空树,这是一种特殊情况。任意一棵非空树中应满足: 有且仅有一个特定的称为根的节点 当n1时,其余结点可分为m个互不相交的有限集合T1、T2、T3……Tm;每个集合又

    2024年02月15日
    浏览(49)
  • 一篇学完:王道考研408数据结构(全)

    PDF版本附在  lengyueling.cn 对应 文章结尾,欢迎下载访问交流 数据结构在学什么 如何用程序代码把现实世界的问题信息化 如何用计算机高效地处理这些信息从而创造价值 数据结构的基本概念 什么是数据: 数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到

    2023年04月08日
    浏览(45)
  • 【数据结构】24王道考研笔记——树与二叉树

    树是n个结点的有限集合,n=0时,称为空树。非空树满足: 除了根节点外,任何一个结点都有且仅有一个前驱 结点的层次(深度):从上往下数 结点的高度:从下往上数 树的高度(深度):总共有多少层 结点的度:有几个孩子(分支) 树的度:各节点的度的最大值 森林:

    2024年02月13日
    浏览(49)
  • 王道考研数据结构第五章知识点

    5.1.1 树的定义和基本术语   祖先节点:(对于你来说),父亲和爷爷都是祖先节点 子孙节点:对于父亲来说,父亲下面所有的节点都叫子孙节点 双亲节点(父节点):一个节点的直接前驱就是它的父节点  兄弟节点:例如二叔,三叔都是父亲的兄弟节点 堂兄弟节点:对于你来说,

    2024年02月15日
    浏览(51)
  • 【23考研】计算机408数据结构代码题强化阶段划重点(王道书)

    视频链接:【23考研】10分钟带你整理408数据结构强化阶段代码题复习重点 本篇只适合考408的同学,请自主命题的同学自觉右上角×掉 因为王道书为了照顾自主命题的同学,所以很多算法也给出了代码实现,实际上对于考408的同学,很多代码是不需要掌握的,毕竟408的代码题没

    2024年02月15日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包