栈和队列8 - 数据结构和算法30
栈和队列8
让编程改变世界
Change the world by program
队列的顺序存储结构
为什么小甲鱼上节课说队列的实现上我们更愿意用链式存储结构来存储? 我们先按照应有的思路来考虑下如何构造队列的顺序存储结构,然后发掘都遇到了什么麻烦。 我们假设一个队列有n个元素,则顺序存储的队列需建立一个大于n的存储单元,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端则是队头。 No Pic You Say a J8 [caption id="attachment_2156" align="alignnone" width="550"] 队列的顺序存储结构[/caption] 入队列操作其实就是在队尾追加一个元素,不需要任何移动,时间复杂度为O(1)。 出队列则不同,因为我们已经架设下标为0的位置是队列的队头,因此每次出队列操作所有元素都要向前移动。 [caption id="attachment_2157" align="alignnone" width="550"] 队列的顺序存储结构[/caption] 在现实中也是如此,一群人在排队买火车票,前边的人买好了离开,后面的人就要全部向前一步补上空位。 可是我们研究数据结构和算法的一个根本目的就是要想方设法提高我们的程序的效率,按刚才的方式,出队列的时间复杂度是O(n),效率大打折扣! 如果我们不去限制队头一定要在下标为0的位置,那么出队列的操作就不需要移动全体元素。 [caption id="attachment_2158" align="alignnone" width="550"] 队列的顺序存储结构[/caption] 但是这样也会出现一些问题,例如按下边的情形继续入队列,就会出现数组越界的错误。 [caption id="attachment_2159" align="alignnone" width="550"] 队列的顺序存储结构[/caption] 可事实上我们有0和1两个下标还空着,这叫假溢出。
循环队列定义
我们再想想,要解决假溢出的办法就是如果后面满了,就再从头开始,也就是头尾相接的循环。 循环队列它的容量是固定的,并且它的队头和队尾指针都可以随着元素入出队列而发生改变,这样循环队列逻辑上就好像是一个环形存储空间。 但要注意的是,在实际的内存当中,不可能有真正的环形存储区,我们只是用顺序表模拟出来的逻辑上的循环。 我们通过一段动画片来加深印象吧! [caption id="attachment_2160" align="alignnone" width="550"] 循环队列[/caption] 于是我们发觉了,似乎循环队列的实现只需要灵活改变front和rear指针即可。 也就是让front或rear指针不断加1,即时超出了地址范围,也会自动从头开始。我们可以采取取模运算处理:
(rear+1) % QueueSize
(front+1) % QueueSize
取模就是取余数的意思,他取到的值永远不会大于除数,大家结合实例拿张纸算一算就知道啦~
代码清单
定义一个循环队列
[codesyntax lang="c"]
#define MAXSIZE 100 typedef struct {ElemType *base; // 用于存放内存分配基地址// 这里你也可以用数组存放int front;int rear; }
[/codesyntax]
初始化一个循环队列
[codesyntax lang="c"]
initQueue(cycleQueue *q) {q->base = (ElemType *) malloc (MAXSIZE * sizeof(ElemType));if( !q->base )exit(0);q->front = q->rear = 0; }
[/codesyntax]
入队列操作
[codesyntax lang="c"]
InsertQueue(cycleQueue *q, ElemType e) {if( (q->rear+1)%MAXSIZE == q->front )return; // 队列已满q->base[q->rear] = e;q->rear = (q->rear+1) % MAXSIZE; }
[/codesyntax]
出队列操作
[codesyntax lang="c"]
DeleteQueue(cycleQueue *q, ElemType *e) {if( q->front == q->rear )return ; // 队列为空*e = q->base[q->front];q->front = (q->front+1) % MAXSIZE; }
[/codesyntax]
人生如栈
人生,就像是栈的演变。 在父亲忙碌的入栈、出栈操作中,你,诞生了! 人生,仿佛是栈的重现。 每天你奔波于事业与家庭之间,做着似乎总是重复的事情,为的只是一餐温饱。 你总说,在哪里跌倒就在哪里爬起来,但是,你发现似乎总是在同一个地方跌倒无数次! 有一那么一次,你弹栈找不到返回地址,你忧郁了,迷茫了。。。。。。 很幸运,你看到了小甲鱼的视频^_^ 他会告诉你,在一个个栈的外边,其实隐藏着一个队列在调用你的每一个栈,只是你还年轻,没办法看得太清楚。 但是,你抬头仰望星空,在孤独中多思考,在彷徨中多回顾,就有希望,不断进取,就能成功! 人生,又是一个大队列的实现,春夏秋冬年复一年,改变的是时间,不变的是你对未来执着的信念! 地球近似于圆形,但并不完美。 选错了方向,你可能要多走一些路, 但,只要你肯坚持到底,你都可以到达终点! [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/BdsUAwIqSQDmyw9R7b2']视频下载[/Downlink] [Downlink href='http://urlxf.qq.com/?UFfUvyI']备胎下载[/Downlink]
转载于:https://www.cnblogs.com/LoveFishC/archive/2013/02/05/3847279.html
栈和队列8 - 数据结构和算法30相关推荐
- 假设有搅乱顺序的一群儿童成一个队列_数据结构与算法系列之栈amp;队列(GO)...
以下完整代码均可从这里获取 栈 栈的基本概念 「后进先出.先进后出就是典型的栈结构」.栈可以理解成一种受了限制的线性表,插入和删除都只能从一端进行 当某个数据集合只涉及在一端插入和删除数据,并且满足后 ...
- java数据结构 队列_Java数据结构与算法[原创]——队列
声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...
- abcde依次进入一个队列_数据结构与算法(6):队列
(文中图片出自王争老师的课程:数据结构与算法之美,侵删) 先进者先出,这就是典型的队列. 根据上篇文章,我们知道栈只支持两个基本操作:入栈 push()和出栈 pop().队列跟栈非常相似,支持的操作 ...
- abcde依次进入一个队列_数据结构与算法 | 一文掌握队列Queue(真题讲解)
本系列内容专为课程面向笔/面试的<数据结构与算法>总结性精讲开设,以图文并茂的方式讲解数据结构,让大家打牢基础,促进对课程内容的掌握,最后做到题解大神,大厂offer拿到手软! 目录:一文 ...
- c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc
数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...
- 【栈和队列】数据结构02-(java实现)
1.栈 1.1 简介 什么是栈呢?大家可以把它想象成一个狭窄的盒子,我们往里面放东西,每次取出时,只能取出最后放进去的(最上面一个),总结来讲就是 "先进后出",如下图: 特点:先 ...
- python 栈实现 加减乘除_数据结构与算法(六):基于栈实现简单的四则运算
栈,是一种操作受限的线性表,其操作规则为:后进者先出,先进者后出. 目录 题目需求: 给定一个字符串,形如"1+6*5/3-8",根据其内容,计算结果,此例结果为3. 解题思路: ...
- 栈和队列-第3章-《数据结构习题集》答案解析-严蔚敏吴伟民版
习题集解析部分 第3章 栈和队列 ...
- 算法面试:栈实现队列的方案
声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍一个有趣的问题:用两个栈实现一个队列.这道题来自互联网公司的算法面试 ...
最新文章
- 远程监控 – 数据采集管道
- ant design vue input change_vue 表单
- 独家 | 图片主题建模?为什么不呢?!
- 内存管理单元--MMU
- 云计算简介+云计算建站平台
- 逐渐增高_健身能不能增高?真相原来是这样
- Pytorch实战1:线性回归(Linear Regresion)
- java getimage_在Java语言中,为了使用getImage的方法,你需要导入的类是()。
- pat 甲级 1010. Radix (25)
- Shell Curses 函数库
- 1、使用Keras构建图像分类器
- matlab $r$n$m,维纳滤波器推导以及MATLAB代码(Wiener Filter)
- 完整版第四方Oreo易支付源码+28K易支付源码
- Detach Procedure
- 如何避免“被贷款”影响个人信用记录?
- 华为光纤猫HG8240破解,开启路由功能表
- cesium颜色值赋值
- Linux加密和安全篇(一)gpg、对称和非对称加密、哈希算法
- linux C 基于事件回调的epoll反应堆模型
- 衡水中学计算机老师,衡水中学资深老师:电脑阅卷本就是一种淘汰机制,学生都不以为然...
热门文章
- 凸台可以延伸吗_知道对比度、清晰度和锐化的差别吗?操作不好,让一张照片报废...
- 演出节目名字_华晨宇——让我看娱乐节目看到感动
- oracle+5秒钟一个间隔,ORACLE日期时间函数大全 (二)
- java 定位打印_Java定位打印(Java location printing).doc
- WIN7 VS2010下配置 CGAL-4.7
- 判断某个磁盘中是否有某个文件
- 删除重复行 oracle,Oracle删除重复行传智播客
- sqlserver 查询某个时间段执行sql语句_为什么 SQL 查询不是先执行SELECT语句?
- css图片居中_网页元素居中的n种方法
- 查询很慢会导致锁表吗_MySQL的insert into select 引发锁表