3.4.3 循环队列之静态存储空间(2)

静态数组队列(循环队列)基本操作 /*静态数组队列(循环队列):C语言实现版*/ /*特点:队列大小固定,可以防止伪溢出发生*/ #include #include /*定义队列*/ #define MAX_Q_SIZE 5 /*最大队列长度+1 ,实际长度为4*/ typedef struct { int *base ; /*初始化时分配存储空间,假设元素类型为int*/ int front ; /*头指针,实际上 阅读详情

在循环队列中,队尾指针可能小于队头指针。

入队指针时,队尾指针加一。

当队列满时,队尾指针等于对头指针,和队列空的条件是一样的。

为了区分队满与队空,在循环队列中,少用一个存储单元,也就是在最大存储空间为MAX_QSIZE的循环队列中,最多只能存放MAX_QSIZE-1个元素。这样,队列空的条件任为队尾指针等于对头指针,队列满的条件改为(队尾指针+1)对MAX_QSIZE求余等于对头指针。

 

                                                                                                                                

 /* c3-3.h 队列的顺序存储结构(循环队列) */
 #define MAX_QSIZE 5 /* 最大队列长度+1 */
 typedef struct
 {
   QElemType *base; /* 初始化的动态分配存储空间 */
   int front; /* 头指针,若队列不空,指向队列头元素 */
   int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */
 }SqQueue;

 

 

 /* bo3-3.c 循环队列(存储结构由c3-3.h定义)的基本操作(9个) */
 void InitQueue(SqQueue *Q)
 { /* 构造一个空队列Q */
   (*Q).base=(QElemType *)malloc(MAX_QSIZE*sizeof(QElemType));
   if(!(*Q).base) /* 存储分配失败 */
     exit(OVERFLOW);
 
  (*Q).front=(*Q).rear=0;
 }

                                                                                                                                       

 void DestroyQueue(SqQueue *Q)
 { /* 销毁队列Q,Q不再存在 */
   if((*Q).base)
     free((*Q).base);
   (*Q).base=NULL;
   (*Q).front=(*Q).rear=0;
 }

                                                                                                                        

 void ClearQueue(SqQueue *Q)
 { /* 将Q清为空队列 */
   (*Q).front=(*Q).rear=0;
 }

 Status QueueEmpty(SqQueue Q)
 { /* 若队列Q为空队列,则返回TRUE;否则返回FALSE */
   if(Q.front==Q.rear) /* 队列空的标志 */
     return TRUE;
   else
     return FALSE;
 }

 int QueueLength(SqQueue Q)
 { /* 返回Q的元素个数,即队列的长度 */
   return(Q.rear-Q.front+MAX_QSIZE)%MAX_QSIZE;
 }

 Status GetHead(SqQueue Q,QElemType *e)
 { /* 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR */
   if(Q.front==Q.rear) /* 队列空 */
     return ERROR;
   *e=Q.base[Q.front];
   return OK;
 }

 Status EnQueue(SqQueue *Q,QElemType e)
 { /* 插入元素e为Q的新的队尾元素 */
   if(((*Q).rear+1)%MAX_QSIZE==(*Q).front) /* 队列满 */     //逻辑上位置是相邻的,洗洗体会
     return ERROR;
   (*Q).base[(*Q).rear]=e;
   (*Q).rear=((*Q).rear+1)%MAX_QSIZE;
   return OK;
 }

                        

 Status DeQueue(SqQueue *Q,QElemType *e)
 { /* 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR */
  
if((*Q).front==(*Q).rear) /* 队列空 */
     return ERROR;
   *e=(*Q).
base[(*Q).front];
   (*Q).front=((*Q).front+1)%MAX_QSIZE;   //注意是加一,队列头的位置加1,细细体会。
   return OK;
 }

                                                                                                          

 void QueueTraverse(SqQueue Q,void(*vi)(QElemType))
 { /* 从队头到队尾依次对队列Q中每个元素调用函数vi() */
   int i;
   i=Q.front;
   while(i!=Q.rear)
   {
     vi(Q.base[i]);
     i=(i+1)%MAX_QSIZE;
   }
   printf("\n");
 }

 

 

 /* main3-3.c 循环队列 检验bo3-3.c的主程序 */
 #include"c1.h"
 typedef int QElemType;
 #include"c3-3.h"
 #include"bo3-3.c"

 void print(QElemType i)
 {
   printf("%d ",i);
 }

 int main()
 {
   Status j;
   int i=0,l;
   QElemType d;
   SqQueue Q;
   InitQueue(&Q);
   printf("初始化队列后,队列空否?%u(1:空 0:否)\n",QueueEmpty(Q));
   printf("请输入整型队列元素(不超过%d个),-1为提前结束符: ",MAX_QSIZE-1);
   do
   {
     scanf("%d",&d);
     if(d==-1)
       break;
     i++;
     EnQueue(&Q,d);
   }while(i<MAX_QSIZE-1);
   printf("队列长度为: %d\n",QueueLength(Q));
   printf("现在队列空否?%u(1:空 0:否)\n",QueueEmpty(Q));
   printf("连续%d次由队头删除元素,队尾插入元素:\n",MAX_QSIZE);
   for(l=1;l<=MAX_QSIZE;l++)
   {
     DeQueue(&Q,&d);
     printf("删除的元素是%d,请输入待插入的元素: ",d);
     scanf("%d",&d);
     EnQueue(&Q,d);
   }
   l=QueueLength(Q);
   printf("现在队列中的元素为: \n");
   QueueTraverse(Q,print);
   printf("共向队尾插入了%d个元素\n",i+MAX_QSIZE);
   if(l-2>0)
     printf("现在由队头删除%d个元素:\n",l-2);
   while(QueueLength(Q)>2)
   {
     DeQueue(&Q,&d);
     printf("删除的元素值为%d\n",d);
   }
   j=GetHead(Q,&d);
   if(j)
     printf("现在队头元素为: %d\n",d);
   ClearQueue(&Q);
   printf("清空队列后, 队列空否?%u(1:空 0:否)\n",QueueEmpty(Q));
   DestroyQueue(&Q);
 }

 

 

 

VS2022+Qt6保姆级配置指南:从插件安装到项目互通全流程(附常见错误解决) 本文提供了一份详细的Visual Studio 2022与Qt6集成开发环境配置指南。从插件安装、环境搭建到项目创建与互通,涵盖了全流程操作步骤,并针对常见的配置错误和调试问题提供了实用的解决方案,帮助开发者高效构建企业级桌面应用。 阅读详情

相关推荐

3分钟接入满血版DeepSeek-R1:字节火山引擎手把手教程!免费50万tokens!

3分钟接入满血版DeepSeek-R1:字节火山引擎手把手教程!免费50万tokens!

hunteritself的博客 2万+

循环队列的队空与队满的条件

为了方便起见,约定:初始化建空队时,令       front=rear=0,   当队空时:front=rear   当队满时:front=rear 亦成立   因此只凭等式front=rear无法判断队空还是队满。  有两种方法处理上述问题:     (1)另设一个标志位以区别队列是空还是满。     (2)少用一个元素空间,约定以“队列头指针front在队尾指针rear的下一个位

woxiaozhi的专栏 2339

保姆级教程:在Windows上用Docker Desktop一键部署Dify 1.0.1(附国内镜像加速)

本文提供在Windows系统上使用Docker Desktop快速部署Dify 1.0.1的详细教程,包括环境准备、国内镜像加速配置、Dify容器部署实战及常见问题解决方案。特别针对国内用户优化,确保快速完成部署并提升开发效率。

weixin_33738555的博客 282

循环队列的两种判断队列空和满的条件

少一个存储位置的 队列为空时:rear= =front 队列满时:(rear+1)%maxSize= =front 不少一个存储位置时:加一个标志flag或者计数的count 入队时flag=true 出队时flag=false 队满:rear= =front&flag 队空:rear= =front&!flag 开始时count=0 入队时:count++ 出队是:count– 队满:rear ==front &&count=maxsize 队空:rear ==front

qq_44332021的博客 9581

从专利库到Zemax:一个6mm定焦镜头从零到交付的完整设计流程(含CodeV转换技巧)

本文详细介绍了6mm定焦镜头从专利库检索到最终交付的全流程设计,重点解析了CodeV与Zemax工具链的无缝衔接技巧。通过实际案例展示规格定义、专利筛选、结构适配、非球面优化等关键步骤,帮助光学设计工程师提升设计效率和制造良率。特别包含CodeV转换Zemax的实用技巧,适用于机器视觉和安防镜头开发。

weixin_42561040的博客 161

信号完整性仿真SI之Cadence Sigrity SPEED2000_眼图仿真(四)

今天给大家分享一个仿真的操作流程,是关于Cadence Sigrity SPEED2000的时域波形仿真和眼图仿真。我们会经常看见硬件工程师调试示波器上的一些信号的波形变化,其实这些也可以通过仿真电路的搭建来做出投板前的仿真,来优化走线,以减少版本的迭代次数。如果要和实际的信号保持一致,就要求仿真设置的参数和实际的参数保持一致,这也是仿真的重点和难点。下面先让我们了解一下Cadence Sigrity SPEED2000时域仿真的操作流程: 1.仿真模式选择与文件导入 选择Cadence Sigrity下的

刘小同学的博客 1万+

队列的存储和循环队列

一、队列的存储结构 1、队列的物理存储可以用顺序存储结构,也可用链式存储结构。相应队列的存储方式也分为两种,即顺序队列和链式队列。 2、顺序队列可以用一维数组表示如下: #define MAXQSIZE 100 //最大队列长度 Typedef struct { QElemType *base; //初始化的动态分配存储空间 int front; //头指针 int rear; //尾指针 }SqQueue; 二、循环队列的基本操作语句 1、队列的初始:front=rear=0; 2、

kxbdys的博客 2705

无线充电Qi协议正向通信FSK的解调设计

常见的FSK解调方法是使用频率锁相环(PLL)来跟踪输入信号中的频率变化。PLL根据输入信号的频率变化来生成数字信号,从而实现FSK信号的解调。本文将详细介绍无线充电Qi协议正向通信FSK的解调设计,并提供相应的源代码。在上述示例代码中,我们首先定义了FSK解调的参数,包括采样率、载波频率、每个比特的持续时间和比特判定阈值。最后,通过比较滤波后的信号与比特判定阈值,我们将解调后的数字数据转换为0和1的序列。请注意,上述代码仅为示例,实际的解调设计可能需要根据具体的应用场景和系统要求进行调整和优化。

IunScala的博客 2444

数据结构:循环队列(C语言实现)

生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题;从生活中,可以抽象出队列的概念,队列就是一个能够实现“先进先出”的存储结构。队列分为链式队列和静态队列;静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。这里讲的是循环队列,首先我们必须明白下面几个问题 一、循环队列的基础知识 1

lpp0900320123的专栏 12万+

YOLOv11架构革新:华为VanillaNet与BiFPN深度融合的突破性改进实战指南

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有!

LXY_LOVE36的博客 136

第6篇:ESP32连接无源喇叭播放音乐《涛声依旧》

相邻两个音之间的倍数是2^(1/12),约等于1.0594630943592952645618252949463)。这样一来,高八度的do频率是低八度do的两倍。我们把频率440赫兹作为中央C ,C调的歌就是把频率440赫兹当作do,乐谱中写作:1=C。一个八度分成12份,八个八度的十二平均音率对应的频率如下(从33Hz到7902Hz)。相邻的两个音之间的差一个半音,12345671之间的间隔分别是“全全半全全全半”。D调的歌就是把从440后面第二个音494赫兹当作do,乐谱中写作1=D。

Txwtech 1424

循环队列:判断队列空和满的3种方法

  一.少用一个存储位置   第一种情况: 当队列为空时条件:rear == front 当队列满时条件为:rear+1 == front      上述方式对于上述图是适用的,但如果出现了有下标标识,上述判断条件就不适用了。比如下图有下标了,当队列满时,显然条件就不能判断了,就要用到另一种判断。   第二种情况: 当队列为空时条件:rear == front 当队列满时条件为:(rear+1)...

xxxxxxyao的博客 6万+

YOLO模型从10MB瘦到2MB!剪枝+INT8量化双方案(精度损失<1%,附部署代码)

摘要:本文介绍了一种针对边缘设备的YOLO模型轻量化方案,通过"结构化剪枝+INT8量化"组合技术,将YOLOv8n模型从6.4MB压缩至2MB,体积减少68.75%,推理速度提升80%,同时保持精度损失小于1%。文章详细讲解了剪枝工具选择、通道剪枝实现、量化校准等关键步骤,并提供了完整的代码示例。特别强调了剪枝保留率、校准集使用、微调必要性等实践要点,帮助开发者在树莓派等资源受限设备上实现高效目标检测。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 756

数据结构:循环队列的实现(leetcode622.设计循环队列)

循环队列的实现

小青菜的博客 2654

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C语言数据结构———循环队列(静态数组实现方式)

一、队列 队列是一种先进先出操作受限的线性表结构。它只允许从队尾插入,也叫入队;只允许从队首删除,也叫出队。 二、队列分类 链式队列 —— 用链表实现的队列 顺序队列 —— 用数组实现的队列。数组可为静态数组或动态数组,顺序队列通常必须为循环队列。 注意: 循环队列是解决顺序队列内存空间利用率最大化的一种解决方案。 顺序队列 循环队列 三、队列类型定义 #define QUEUE_ZISE ...

RaphaelCeo的博客 8277

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

循环队列之静态队列

从生活中,能够抽象出队列的概念,队列就是一个能够实现“先进先出”的存储结构。队列分为链式队列和静态队列;静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。这里讲的是循环队列,首先我们必须明确以下几个问题 一、循环队列的基础知识 1.循环队列须要几个參数来确定 循环队列须要2个參数,front和rear 2.循环队列各个參数的含义 (1)队...

u012420317的博客 501

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

循环队列的基本操作-C语言

循环队列的基本操作一、循环队列二、循环队列的理解 一、循环队列 为充分利用向量空间,克服上述“假溢出”现象的方法是:将为队列分配的向量空间看成为一个首尾相接的圆环,并称这种队列为循环队列(Circular Queue)。 二、循环队列的理解 例:设有循环队列QU[0,5],其初始状态是front=rear=0,各种操作后队列的头、尾指针的状态变化情况如下图所示。 ...

溯洄℡ 1万+

循环队列的c语言实现

一、什么是循环队列     1、基本概念     队列就是一个能够实现“先进先出”的存储结构,队列分为链式队列和静态队列。静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。说白了循环队列就是一个数组,我们把这个数组当成首尾相连来使用(写到数组的末尾后从头开始写)。     2、结构体 typedef char Item;

倚楼听风雨的博客 7188

队列_静态循环队列

1、 队列                   定义   一种存储结构可以实现“先进先出”                   分类                                             链式队列         用链表实现                                     静态队列         用数组实现(为了节约存储空间通常

风起何缘的专栏 701

静态队列

静态队列- --用数组实现 静态队列通常都必须是循环队列 循环队列的讲解: 1.静态队列为什么必须是循环队列 数组表示的问题      对于队列最好的方法是使用链表实现,因为对于数组来说,队列可能会出现下面这种情况: 如图所示,不可以继续添加元素,否则会造成数组越界而遭致程序出错。然而此时又不应该扩充数组,因为还有大量实际空间未被占用。 此时我们应该如何解决这个问题呢?我们将其实现...

ywl470812087的博客 11万+

静态队列为什么必须是循环队列

首先静态队列是基于数组实现的,如果是普通数组,规定font指向第一个元素的位置,rear指向最后一个元素位置的下一个位置 假设现在进行入队操作,此时 rear(后面)指针往后移动一位;出队则是font向后移动一位,此时会出现一个问题, 就是已经删除的元素所使用的空间无法继续使用; 因为每次入队或者出队都是font或者rear向后移动一位,font指针无法往前移动,此时就会造成

qq_33804730的博客 1855

循环队列的插入与删除

队列:一种可以实现“先进先出”的存储结构

Lookdrama的博客 6302

<数据结构>静态数组实现循环队列

队列有几种实现方式:顺序表实现和链表实现。顺序表实现又包括静态数组实现和动态数组实现,前者是否需要Destroy还需再学习,但后者是需要对申请的空间进行释放的。链表实现又可以根据是否有头结点来分,这个还需要后续学习。

djs_snowyyy的博客 217

【数据结构】静态循环队列的操作

静态循环队列的操作 详细请参考以下代码: #include #include #define MAX_SIZE 100 typedef struct { int front; int rear; int data[MAX_SIZE]; }Queue; // 循环队列 void initQueue(Queue * sq); void DestoryQueue (Queue * s

haonanren2bu2的专栏 935

数据结构基础(5)--队列和循环队列详解--静态方式

队列和循环队列详解

Crazy David 4151

队列-静态循环队列

静态循环队列,队列拿出来了一个存储位置不存放数据来区分 栈空和栈满

u013258319的专栏 704
上一篇: 3.4.3 循环队列--------队列的顺序表示与实现(1)
下一篇: 3.4.3 循环队列之动态存储空间 (3 )
sjmp
博客等级 码龄15年 56粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值