首页 > 其他分享 >循环队列

循环队列

时间:2023-12-10 19:22:05浏览次数:22  
标签:head return 队列 queue tail 循环 指针

一、循环队列

环形队列,有两个指针:头指针和尾指针。在队尾写入,移动尾指针;从队列头部读取,移动头指针。环形队列,其特殊性在于"环形", 内存空间可以不断重复使用,无需频繁分配和释放内存。通常,我们用一个固定长度的数组来实现循环队列。

示意图:

  • 1.初始化循环队列

初始化:创建一个空的顺序队列,需要设定队首指针和队尾指针都指向同一个位置,一般初始都设置为0,即队列为空。head = tail =0;

// 初始化环形队列 
void  CirQueueInit(Queue *queue)
{
	queue->head = 0;
	queue->tail = 0;   // head等于tail表示循环队列为空 
}
  • 2.判空和判满

  • 牺牲一个元素空间,来区别队空或队满。
    判断是否为空:通过检查队首指针和队尾指针是否相等来判断队列是否为空,head==tail队列为空。
    判断是否为满:当队尾指针指向数组的最后一个位置时,下一个要插入的位置就是队头指针,即(tail + 1) % SIZE == head时,队满。

// 判空 返回1队列空 
int IsEmpty(Queue *queue)
{
	return 	(queue->head == queue->tail);
}

// 判满 返回1队列满
int IsFull(Queue *queue)
{
	return (queue->tail + 1) % SIZE ==  queue->head;	
} 

  • 3.入队

元素入队:也被称为插入操作,是将一个新元素添加到队列尾部的操作。
入队时,tail指针变化:tail= (tail+1)%SIZE;queue[tail] = val;

// 入队 val入队元素 
int CirQueuePush(Queue *queue, int val)
{
	// 如果队满,不能入队
	if(IsFull(queue))
	{
		printf("队满,无法入队\n");
		return 1;	// 入队失败	
	}
	queue->tail =  (queue->tail +1) % SIZE;
	queue->buf[queue->tail] = val;
	return 0; 
}
  • 4.出队

元素出队:也被称为删除操作,是将队列头部的元素移除的操作。
出队时,head指针变化:head=( head +1)%SIZEtemp = queue[head];

// 出队 返回出队元素 
int CirQueuePop(Queue *queue)
{
	// 如果队空,不能出队
	if(IsEmpty(queue))
	{
		printf("队空,不能出队\n");
		return 1;	// 出队失败	
	}
	queue->head = (head + 1) % SIZE;
	int temp =  queue->buf[queue->head];
	return temp;
}		 
  • 5.取队头

头元素就是队列中的第一个元素,可以通过返回队首指针的值来获取。

// 获取队头元素
int GetCirQueueHead(Queue *queue)
{
	if(IsEmpty(queue))
	{
		printf("队空,无元素\n");
		return 1;	// 出队失败	
	}
	int temp = queue->head + 1;
	return queue->buf[temp];		
} 
  • 6.取队尾
    队列中的最后一个元素,可以通过返回队尾指针的值来获取。
// 获取队尾元素
int GetCirQueueTail(Queue *queue)
{
	if(IsEmpty(queue))
	{
		printf("队空,无元素\n");
		return 1;	// 出队失败	
	}
	return queue->buf[queue->tail];
} 
  • 7.获取循环队列长度

(tial - head + SIZE)%SIZE

// 获取队列长度
int GetCirQueueLen(Queue *queue)
{
	return (queue->tial - queue->head + SIZE)%SIZE;	
} 

标签:head,return,队列,queue,tail,循环,指针
From: https://www.cnblogs.com/xiaohuzaixue/p/17879061.html

相关文章

  • Day24 DoWhile循环
    DoWhile循环对于while语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。do...while循环和while循环相似,不同的是,do...while循环至少会执行一次。do{//代码语句}while(布尔表达式);While和do-While的区别:while先判断后执行。dow......
  • Day25 For循环
    For循环for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。for循环执行的次数是在执行前就确定的。语法格式如下:for(初始化;布尔表达式;更新(迭代)}{​//代码语句}在idea中直接输入100.for回车即自动填写for(inti=0;i<100;i++){}......
  • 架构核心技术之分布式消息队列
    Java全能学习+面试指南:https://javaxiaobear.cn今天我们来学习分布式消息队列,分布式消息队列的知识结构如下图。主要介绍以下内容:同步架构和异步架构的区别。异步架构的主要组成部分:消息生产者、消息消费者、分布式消息队列。异步架构的两种主要模型:点对点模型和发布订阅模型......
  • 视频展播神器,批量添加、快速修改视频,自动循环播放,无损画质!如果你也在寻找一款能够快速
        做展播视频的朋友们,你是否也在为快速修改视频发愁?小小的改动都需要繁琐的剪辑来解决,轮播结束要守着立刻重来一次,耗时耗力,小小的工作,大大的烦恼!来看看这款专为企业展播和针对不露脸无人直播设计的全新工具——《小星星去重播放器》!    《小星星去重播放器》是一......
  • 学C笔记归纳 第十篇——循环算法优化
    练习1:求1!+2!+...+10!一般算法:双层循环,外层1~10,内层计算每个数的阶乘,在外层把阶乘相加。intmain(){inti=0;intj=0;intjc=1;intsum=0;for(i=1;i<=10;i++){jc=1;//for(j=1;j<=i;j++){......
  • 数字电路设计--for循环实现mux
    多路选择器mux是数字电路设计中很常见的一种电路结构,平时写verilog也经常会需要用到。但想象一个场景,输入是256bit信号,输出是8bit信号,选通信号是8bit,如果写一个组合逻辑电路,用case来描述,未免太麻烦了。因此用for循环来构造mux就更方便了,示例代码如下:1moduletest1(inputwi......
  • day11栈与队列
    day11栈与队列20.有效的括号1047.删除字符串中的所有相邻重复项150.逆波兰表达式求值1有效的括号给定一个只包括'(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被......
  • Leetcode刷题day9-栈.队列-栈转队列.队列转栈
    232.用栈实现队列232.用栈实现队列-力扣(LeetCode)请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:voidpush(intx) 将元素x推到队列的末尾intpop() 从队列的开头移除并返回元素intpeek() 返回队......
  • 轻松拿下C语言的分支与循环结构
    C语言是由顺序结构、选择结构、循环结构组成的结构化程序设计语言。我们日常所见的事情都可以拆分成这三种结构或者这三种结构的组合。顺序结构:按语句出现的先后顺序,以此执行。选择结构(也叫分支结构):根据所给定的条件选择是否执行。循环结构:根据要求,将语句重复执行多次。接下来......
  • 循环缓冲区 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/circular-buffers.html循环缓冲区作者[email protected]@linux.ibm.comLinux提供了许多功能,可用于实现循环缓冲区。有两组这样的功能:用于确定2的幂大小缓冲区信息的便利函数。......