数据结构--队列与循环队列

队列

        队列是什么,先联想一下队,排队先来的人排前面先出,后来的人排后面后出;队列的性质也一样,先进队列的数据先出,后进队列的后出;就像图一的样子:

 图1

        如图1,1号元素是最先进的,开始出队时,那么他就是最先出的,然后12进队,就应该排在最后面,等待前面的所有元素出队完成后才能出队;有个专业的名词叫FIFO(first in first out),翻译过来就是先进先出的意思;

队列的数据结构:

        数据结构 = 结构定义 + 结构操作;

        队列的结构定义就是:

       物理结构:

        一个存储数据的数据域,这里我们用的是数组;一个头指针,一个尾指针;头指针指向,下个出队的元素的位置,尾指针指向最后一个元素的位置,然后还有队列的长度,元素个数;

        那么用结构体封装他的物理结构代码如下:

typedef struct Queue {int size, cnt, head, tail;//4个变量分别是,队列长度,元素个数,头指针,尾指针//因为用的是数组,所以头尾指针,直接用一个int变量就可以存贮了void *data;//数据域
} Queue;

        逻辑结构:

        他的逻辑结构就是,先进先出,需要去维护这个性质,如果破坏了性质就不能算做数据结构了,因为你破坏了它的结构定义;所以一定不要破坏数据结构的结构定义;

结构操作:

        说完了结构定义来看下,队列它是如何出队入队的:

        现在出队一个元素,那么Head指针就应该指向下一个位置,也就是位置1,那么head++,head = 1:

         现在入队一个元素,假如入队元素12,那么Tail指针应该先Tail++,在放入新元素,不然就覆盖掉了元素11,如下图:

        可能有人会问,1不是出队了嘛,为什么在图中还有,是我画图没有画完,但是,在写代码的时候,情况就是这样的,因为这是一个数组,你只是吧头指针往后偏移了,但是那个位置的元素他还是存在的,只是不会去访问到了,那么他也相当于出队了;也就是相当于我们在数组上面维护了一个队列,他从头部减少,尾部增加的一个思想;

循环队列

        提到队列了,也不得不提循环队列,循环队列是什么,假如长度为10的队列,它入队了10个元素,也出队了10个元素,那么头尾指针现在是在同一个位置,就是下图情况:

        他现在里面是没有元素的,你现在看到的1-9是已经出队了的,10是还没有出队的,那么怎么办,那就直接让tail = 0,又从数组的头部开始 ,如图

        

         元素11入队,直接覆盖掉之前的元素1,那么下次入队就是从位置1开始,出队还是元素10先出队,然后出队后,Head指针那么也应该等于0,也从数组的头开始再次出队;

        那么如何去判断队列为空呢,在定义物理结构是吗,有一个变量记录着,队列当前的元素个数;

代码实现:

        那么思路大概讲完了,代码实现的是循环队列,来看代码实现:

        

#include <stdio.h>
#include <stdlib.h>
#include <time.h>typedef struct Queue {int size, cnt, head, tail;//4个变量分别是,队列长度,元素个数,头指针,尾指针//因为用的是数组,所以头尾指针,直接用一个int变量就可以存贮了int *data;//数据域
} Queue;Queue *init(int n) {//初始化队列,向计算机借空间Queue *q = (Queue *)malloc(sizeof(Queue));q->data = (int *)malloc(sizeof(int) * n);q->size = n;q->cnt = q->head = q->tail = 0;return q;
}
int empty(Queue *);
int front(Queue *q) {//获取队列头部元素if(empty(q)) return -1;return q->data[q->head];
}int empty(Queue *q) {//判读队列是否为空return q->cnt == 0;
}int push(Queue *q, int val) {//入队if (q->cnt == q->size) return 0;q->data[q->tail++] = val;if (q->tail == q->size) q->tail = 0;q->cnt++;return 1;
}int pop(Queue *q) {//出队if (empty(q)) return 0;q->head++;q->cnt--;if (q->head == q->size) q->head = 0;return 1;
}
void clear(Queue *q) {//有借有还if (!q) return ;free(q->data);free(q);return ;
}void output(Queue *q) {//打印队列中的元素printf("Queue(%d) :[", q->cnt);for (int i = q->head, j = 0; j < q->cnt; j++) {j && printf(" ");printf("%d", q->data[(i + j) % q->size]);}printf("]\n");return ;
}int main() {//测试srand(time(0));int op, val;Queue *q = init(5);for (int i = 0; i < 20; i++) {op = rand() % 4;         val = rand() % 100;switch (op) {case 0:case 1:case 2: {printf("%d push in Queue is %d\n", val, push(q, val));} break;case 3: {printf("%d ", front(q));printf("pop Queue is %d\n", pop(q));} break;}output(q);}clear(q);return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1618879.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Flutter】Flutter 使用 toggle_switch 实现切换按钮

【Flutter】Flutter 使用 toggle_switch 实现切换按钮 文章目录 一、前言二、安装和基本使用三、Toggle Switch 的基础示例四、Toggle Switch 的高级用法五、实际业务中的完整示例六、总结 一、前言 你好&#xff0c;我是小雨青年&#xff0c;今天我要为大家介绍一个非常实用的…

node.js安装好后测试报错解决

node.js的版本是18.X.X node.js安装好后&#xff0c;执行命令&#xff1a; npm install express -g 报错&#xff01;&#xff01;&#xff01; 解决办法&#xff1a; 看报错是由于权限不够&#xff0c; 所以打开cmd时&#xff0c;以管理员的方式打开 然后再执行命令就OK了…

dataframe更改数据的方法(超级简单易懂!!!)

&#xff1a;&#xff1a;&#xff1a;&#xff1a;插入数据 import pandas as pd import numpy as npdfpd.DataFrame(data[[zs,18,1],[ls,19,1],[ww,17,2]],index[stu0,stu1,stu2],columns[name,age,group]) df 更改单个数据的方法 取出数据后直接赋值&#xff08;一般用不到…

怎样把PDF转换成WORD简单有效

其实文件格式转换的方法大同小异。无非就是选择格式&#xff0c;添加文件&#xff0c;开始转换&#xff0c;但是就这简单的几步&#xff0c;操作不好也会造成转换失败&#xff0c;下面小编以最常见的pdf转换成word格式为例&#xff0c;给大家详细说说pdf转换成word需要注意的地…

如何將人臉變漂亮(一)

利用 mediapipe 進行處理 規劃 1.先把人臉辨識&#xff0c;然後取出框框 2.把框框內的人臉&#xff0c;進行美容 -高反差保留 (1)曝光度調整 (2)綠色與藍色&#xff0c;疊加 (3)YUCIHighPassSkinSmoothingMaskBoost -調整圖像亮度 -混合 3.把人臉的嘴巴&#xff0c;進行塗紅 4.…

pdf转word文档怎么转?看完这篇你就会了

随着数字化时代的到来&#xff0c;电子文档的使用越来越普遍。无论是在学校里撰写论文、在公司里编辑报告&#xff0c;还是在日常生活中收到合同或简历&#xff0c;我们都可能遇到需要将pdf文件转换为word格式的情况。这时&#xff0c;一款高效且易用的pdf转word软件便成为我们…

那种单眼皮小眼睛塌鼻梁厚嘴唇但还挺好看的女生

那种单眼皮小眼睛塌鼻梁厚嘴唇但还挺好看的女生 Data Dance Data Dance大数据采集分析软件&#xff0c;大数据技术经典算法 只有不符合大众审美的人&#xff0c;所以每个人都是美的&#xff01;你们通过这篇文章认识了照片上的我&#xff0c;但如果你们在现实生活中见到我&…

pdf如何转换成word格式最简单

当我们遇到难题的时候&#xff0c;应该积极地寻找方法去解决问题&#xff0c;特别是工作中&#xff0c;只有遇到问题解决问题才能更好的完成工作&#xff0c;拿文件转换问题来说&#xff0c;遇到难转换的文件格式&#xff0c;我们只要积极寻找解决方法还是可以轻松完成转换的。…

pdf怎么转换成word 文档?这几个小妙招别错过

pdf怎么转换成word 文档&#xff1f;想必大家都经常遇到这样的问题&#xff1a;在网上下载了一个 pdf 文件&#xff0c;但是突然需要对其中的文字进行编辑&#xff0c;但是 pdf 文件却不支持直接编辑&#xff0c;这时就需要将 pdf 文件转换成 word 文档&#xff0c;进行编辑。下…

pdf转word文档怎么转?手把手教你转换

随着数字化时代的到来&#xff0c;电子文档在我们的生活和工作中扮演着越来越重要的角色。尤其是pdf格式的文件&#xff0c;由于其可靠性和跨平台的特性&#xff0c;成为了广泛使用的标准文档格式之一。然而&#xff0c;当我们需要对pdf文件进行编辑时&#xff0c;尤其是将其转…

Pandas Dataframe Drop函数的用法

Pandas Dataframe Drop函数的用法 https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop.html

怎么把照片变年轻?这两个照片变年轻小妙招教给你

怎么把照片变年轻呢&#xff1f;随着年龄的增长&#xff0c;许多人会感到自己不再年轻&#xff0c;失去了曾经的美貌和活力。通过将照片变年轻&#xff0c;你可以重新体验过去的感觉&#xff0c;回忆起年轻时的美好时光&#xff0c;仿佛回到了过去&#xff0c;让我们感受到那段…

单眼皮眼妆学起来 打造电眼只需六步

很多内双或者单眼皮的MM们都很不自信&#xff0c;觉得自己的眼睛长得不够好看,对于单眼皮怎么画眼线一无所知&#xff0c;所以就不愿意化妆&#xff0c;而且就算化妆也得贴个双眼皮贴&#xff0c;看起来很不自然。其实不一定&#xff0c;现在国际上都爱单眼皮呢!今天&#xff0…

单眼皮比双眼皮高等?

郑昀 20091012 看到一条 玩聚RT 上榜消息&#xff1a;“ RT lookon RT Klaith: 交大医学院的某主任教授曾经和我们吹牛&#xff0c;说单眼皮的人比双眼皮的高等&#xff0c;因为除人以外的动物都只有双眼皮。22次锐推 | 最早发布于2009-10-11 ”。 果真如此&#xff1f; 1、狗…

Docker网络-探索容器网络如何相互通信

当今世界&#xff0c;企业热衷于容器化&#xff0c;这需要强大的网络技能来正确配置容器架构&#xff0c;因此引入了 Docker Networking 的概念。Docker 是一种容器化平台&#xff0c;允许您在独立、轻量级的容器中运行应用程序和服务。Docker 提供了一套强大的网络功能&#x…

Redis 10 大数据类型

1. which 10 1. redis字符串 2. redis 列表 3. redis哈希表 4. redis集合 5. redis有序集合 6. redis地理空间 7. redis基数统计 8. redis位图 9. redis位域 10. redis流 2. 获取redis常见操作指令 官网英文&#xff1a;https://redis.io/commands 官网中文&#xff1a;https:/…

python+mysql+前后端分离国内职位数据分析(源码+文档+指导)

系统阐述的是使用国内python职位数据分析系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 Flask框架和MySql数据库技术搭建系统的整体…

测试渗透前置知识-行业术语

测试渗透前置知识-行业术语 1.肉鸡3.远控4.黑页5.挂马6.大马7.小马8.一句话后门9.后门10.拖库11.社工库12.撞库13.提权14.网络钓鱼15.社会工程学攻击16.rootkit17.IPC$18.弱口令19.默认共享20.shell21.交互式shell22.webshell23.溢出24.注入25.注入点26.旁站入侵27.C段渗透28.内…

TRYLIVE CLOTHING:AR个人魔法试衣间,试尽网上任何衣服

没有有这样的时候&#xff1f;在网上看中了一件衣服或者裤子&#xff0c;就算所有信息都知道了也不知道衣服是否合身&#xff0c;穿上去感觉如何&#xff0c;有的衣服看上去好看&#xff0c;上身效果不一定要。就算在实体店&#xff0c;有时看了很多衣服想试&#xff0c;但又不…

基于3D人像复原技术的试衣平台

基于3D人像复原技术的试衣平台 摘要 近年来&#xff0c;随着社会的进步与发展&#xff0c;人们的物质生活得到了极大的丰富&#xff0c;对衣食住行的要求也越来越高&#xff0c;为了更好地适应现代化生活的需求&#xff0c;网上试衣软件、平台的研究也一直没有停止过&#xf…