队列的顺序存储结构之循环队列

队列的顺序存储结构之循环队列一、队列的定义队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(FirstInFirstOut)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。如图所示:二、循环队列的引出为了避免当队中只剩一个元素的时候,队头队尾重合使处理变得麻烦。所以我们引入两个指针,front指针指向队头元素,rear指针指向队尾元素…

大家好,又见面了,我是你们的朋友全栈君。

一、队列的定义
队列( queue )是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。如图所示:
在这里插入图片描述
二、循环队列的引出
为了避免当队中只剩一个元素的时候,队头队尾重合使处理变得麻烦。所以我们引入两个指针,front指针指向队头元素,rear指针指向队尾元素。这样当front=rear时,队列中不是只剩一个元素,而是它是一个空队列。而且这样也大大方便了我们删除队头元素。这样就当我们删除队头元素时就只需要移动front指针,这样可以大大降低算法的时间复杂度。
但是当删除元素的时候,front不断后移,前面的位置不断空出来。插入元素时rear指针 b不断后移。对于一个有限的队列来说,在不断得插入元素时rear最终会指向一个无效位置。具体情况如下图所示:
删除元素时:
在这里插入图片描述
插入元素时:
在这里插入图片描述
用循环队列可以巧妙得解决这个问题。
三、循环队列
1、循环队列的定义
**我们把队列的这种头尾相接的顺序存储结构称为循环队列。**如下图所示:
循环队列满时:
在这里插入图片描述
循环队列空时:
在这里插入图片描述
判断循环队列空的条件是:

front == rear;

判断循环队列满的条件是:

(rear+1)%6==front

为了区别判空和判满的状态,我们总在插入元素时牺牲一个空间来区别这两种状态,这也是为啥判满的时候是(rear+1)%6==front
2、循环队列的简单实现
(1)循环队列的整体结构的设计

typedef int ElemType;
#define MAX_SIZE 10
typedef structc Queue
{ 
   
	ElemType arr[MAX_SIZE];
	int front;//队头指针
	int rear;//队尾指针
};Queue,pQueue

2、初始化(init)
初始化的时候我们只需要将我们的头指针和尾指针置成0即可。

void init(pQueue pqu)
{ 
   
	if(pqu != NULL)
	{ 
   
	pqu->front = pqu->rear = 0;
	}
} 

3、入队操作(enqueue)
在进行入队操作之前我们首先应该对队列进行判满的操作。如果队列是满的,我们就插入不了元素。如果队列不满我们就可以进行我们的入队操作。
判满

int full(pQueue pqu)
{ 
   
	return (pqu->rear + 1)%MAX_SIZE == front ? 1 : 0;
}

插入元素
插入元素时,我们只需要将这个队列中的rear指针的下标置成我们要插入的元素即可。

int enqueue(pQueue pqu,ElemType val)
{ 
   
	if(full(pqu))
	{ 
   
	return 0;
	}
	pqu->arr[pqu->rear] = val;
	pqu->rear = (pqu->rear + 1)%MAX_SIZE;
	return 1;
}

4、出队操作(dequeue)
在进行出队操作时,我们首先要判断的是队列是否为空。若队列中的元素为空,则就无法进行出队的操作。
判空

int empty(pQueue pqu)
{ 
   
	return (pqu->rear == pqu->front) ? 1 : 0;
}

出队操作

int dequeue(Pqueue pqu)//只是删除元素
{ 
   
	if(empty(pqu))
	{ 
   
	return 0;
	}
	pqu->front = (pqu->front + 1) % MAX_SIZE;
	return 1;
}

5、获取队头元素(front)

int front(pQueue pqu)
{ 
   
	if(empty(pqu))
	{ 
   
	return -1;//牺牲一个数值位
	}
	return pqu->arr[pqu->front];
}

6、获取队尾元素(back)

int back(pQueue pqu)
{ 
   
	if(empty(pqu))
	{ 
   
	return -1;//队列为NULL
	}
	return pqu->arr[(pqu->rear + MAX_SIZE - 1)%MAX_SIZE];
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143020.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月22日 下午2:20
下一篇 2022年5月22日 下午2:20


相关推荐

  • 8 款免费的 MySQL 数据库建模工具

    数据库建模和设计是软件开发过程中必不可少的步骤,一个良好的建模工具可以帮助我们简单快速地完成数据库设计,提高工作的效率。因此,今天给大家推荐几款免费的MySQL数据库建模工具,包括MySQLWorkbench、SQLPowerArchitect、PDMan、RISE、GenMyModel、DBDesigner、dbdiagram.io、Freedgo。

    2022年4月8日
    308
  • 那是什么进程 —— jusched.exe是什么? 它为何运行?「建议收藏」

    那是什么进程 —— jusched.exe是什么? 它为何运行?「建议收藏」       如果你曾经看到任务管理器里有个jusched.exe并很疑惑它究竟是什么,如果你将它关了,那么你很幸运,因为这个进程是负责Java更新的程序,它每个月检查一次Java是否有新的更新,并且一直在那儿浪费内存.       在Windows系统中有个调度任务的功能,由于这个进程每个月才被调度一次,显而易见不是什么重要更新,我不能理解这个进程为什么需要浪费我的内…

    2025年8月8日
    5
  • 3nf和bcnf分解_如何分解成3nf

    3nf和bcnf分解_如何分解成3nf1.3NF分解先求出正则覆盖Fc对于Fc里面的所有函数依赖a->b,均转化为Ri=ab对于所有的模式Ri如果包含候选码,进行第4如果都不包含候选码,将任意一个候选码添加到模式Ri里面如果一个模式被另一个模式包含,则去掉此被包含的模式。例子:…

    2025年7月8日
    4
  • SSRF漏洞学习

    SSRF漏洞学习SSRF漏洞原理SSRF(Server-SideRequestForgery:服务器端请求伪造)是一个由攻击者构造请求,在目标服务端执行的一个安全漏洞。攻击者可以利用该漏洞使服务器端向攻击者构造的任意域发出请求,目标通常是从外网无法访问的内部系统。简而言之就是以服务器的身份来执行请求。常见利用方式伪协议读取文件伪协议读取文件,在SSRF中常用的伪协议就是file:///协议/?url=file:///var/www/html/flag.php内网访问我们从目标主机内

    2022年6月25日
    38
  • 低调炒板栗解锁方法介绍,动物餐厅低调炒板栗怎么解锁

    低调炒板栗解锁方法介绍,动物餐厅低调炒板栗怎么解锁

    2026年3月16日
    2
  • GPU视频编解码「建议收藏」

    GPU视频编解码「建议收藏」一视频编解码基础1.1识别编码流程视频编解码流程1.2YUV颜色空间YCbCr通常是YUV的同义词,Y为明度(luma),CbCr为色度(chroma),Cb为蓝色分量,Cr为红色分量。颜色空间转换公式:–      RGB转YUV•      y=[0.299,0.587,0.114]*[r,g,b]’•      u=[-0.147,-0.28…

    2022年7月13日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号