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);
 }

 

 

 

三维重建之条纹投影结构光(一) 该系列为条纹投影结构光学习笔记,一共分为四篇。第一篇记录文献阅读的笔记,对重要知识点进行摘录介绍。 本篇以理论知识推导为主,主要从以下三个方面进行介绍,首先介绍条纹投影的三角测量原理;然后介绍相位主值的求解和相位展开;最后介绍相位和高度的模型,即相高模型。本篇博文不涉及具体的代码实现。 条纹投影结构光测量原理 ... 阅读详情

相关推荐

RFSoC应用XCZU47DR八发八收FPGA设计方案

本文介绍了基于Xilinx XCZU47DR RFSoC芯片的八发八收FPGA设计方案。该方案采用集成射频数据转换器的SoC架构,支持8路14bit ADC(5GSPS)和8路14bit DAC(9.85GSPS),可直接处理5GHz以下射频信号。硬件设计包含高性能输入缓冲器、QMC校正和复杂混频器,适用于5G/6G通信、雷达、卫星通信等领域。文章详细阐述了ADC/DAC子系统参数,包括通道配置、采样率、带宽等特性,并提供了FPGA顶层模块的硬件接口设计,展示了多通道数据收发处理能力。该方案无需外置混频器,

toonyhe的博客 1792

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

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

woxiaozhi的专栏 2339

双传声器法测量吸声材料的吸声系数(公式推导与解释)

在双传声器法中,通过测量两个位置的声压 p1和 p2​,可以分离出入射波和反射波的声压分量。双传声器法一般在阻抗管中进行,阻抗管的一端为平面波声源,另一端放置待测材料。两个传声器放置在靠近材料的阻抗管内,用于测量管道内的声压。双传声器法是一种常用于测量材料吸声系数的实验方法,通过在管道内使用两个传声器测量声波的入射和反射,来计算出材料的吸声系数。当测试样品较少时,测试时,需要交换两个传声器的位置,目的是为了相位校准。

m0_57407372的博客 1875

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

少一个存储位置的 队列为空时: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

【MATLAB+VScode】VScode调试MATLAB代码的终极指南

本文详细介绍了在VScode中调试MATLAB代码的完整方案。通过配置MATLAB Engine for Python作为桥梁,实现在VScode中设置断点、单步执行、查看变量等交互式调试功能,有效结合了VScode的现代化编辑体验与MATLAB的强大计算内核,显著提升开发效率。

weixin_29161719的博客 412

Lumerical FDTD新手必看:从零开始搭建光子晶体仿真环境(附完整脚本)

本文为Lumerical FDTD新手提供光子晶体仿真环境的完整搭建指南,涵盖从基础参数设置到脚本编写的全流程。通过典型光子晶体带隙分析案例,详细讲解结构建模、仿真参数配置及后处理技巧,并附赠完整MATLAB脚本,帮助用户快速掌握FDTD仿真核心技术。

3c4x5z6v7b的博客 1053

队列的存储和循环队列

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

kxbdys的博客 2705

【35】软考软件设计师——设计模式代码填空(C++版)满分精讲|第5/6题二选一必考

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第35篇,聚焦下午选做题**第5/6题C++版设计模式代码填空**,与上一篇Java版形成双子配套,单题分值稳定12~15分。全文超4000字深度拆解C++独有核心考点:虚函数/纯虚函数、构造与析构函数规范、继承权限、模板类编程在设计模式中的应用;精讲单例、工厂、策略、观察者、适配器五大高频模式的C++专属代码写法,标注所有填空核心点位、语法陷阱、内存安全规范

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 544

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

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

lpp0900320123的专栏 12万+

22、狭义相对论与曲线坐标空间相关知识解析

本文深入解析了狭义相对论与曲线坐标空间的核心概念,涵盖能量-动量张量的定义与守恒、曲线坐标系下的度量张量与基向量性质、协变与逆变张量的变换规则,并介绍了克里斯托费尔符号与协变导数的计算方法。进一步探讨了在弯曲空间中进行微积分运算的基础理论及其在广义相对论中的关键应用,如爱因斯坦场方程如何描述物质-能量对时空曲率的影响,为理解黑洞等引力现象提供了理论框架。

lambda的博客 116

使用verilog实现基于FPGA的TDC设计

verilog实现TDC 高精度时间数字转换器概述(TDC) 简介: TDC被用于测量时间间隔,应用在物理研究、飞行时间测量领域等。 本设计使用verilog实现并在xilinx和altera的FPGA上均可实现! 设计中使用到下述几个模块,包括FIFO,COUNT等,在xilinx下也使用到了一些原语等。下面有实现的代码和仿真截图等。 顶层模块设计如下: module top( input wire start, input wire stop, input wire clk, output wire T

QQ_778132974的博客 6254

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

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

xxxxxxyao的博客 6万+

uniapp - 使用web-view加载本地网页vue页面,用webview导入本地网页,uniAPP中使用web-view加载的本地及远程vue页面+双向通讯功能(兼容微信小程序、安卓苹果APP)

uniapp的App端web-view加载本地html,uniapp微信小程序webview加载本地HTML文件,在uniAPP中使用web-view加载的本地及远程vue页面且进行双向通讯,uni-app的web-view组件,支持加载远程网页,在app环境下,还支持加载本地HTML页面。uniapp WebView组件实现本地网页加载与通讯传值,uniAPP如何内嵌webView引入本地的vue网页示例代码,uniapp在web-view加载的本地及远程HTML中调用uni的API及网页和vue页面跳转

🏆 前端领域优质创作者 5226

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

循环队列的实现

小青菜的博客 2654

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

RaphaelCeo的博客 8277

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

循环队列之静态队列

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

u012420317的博客 501

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

循环队列的基本操作-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、付费专栏及课程。

余额充值