循环队列

什么是队列?

队列(Queue)也是一种运算受限的线性表。它仅仅同意在表的一端进行插入,而在还有一端进行删除。同意删除的一端称为队头(front),同意插入的一端称为队尾(rear)

FIFO原则

队列具有先进先出原则,与栈的先进后出形成对照。

为什么设计循环队列?

队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表,和顺序表一样,顺序队列也是必须用一个向量空间来存放当前队列中的元素。

入队,出队操作原理

因为队列的队头和队尾的位置是变化的,因而要设两个指针和分别指示队头和队尾元素在队列中的位置,它们的初始值地队列初始化时均应置为0。入队时将新元素插入所指的位置,然后将加1。出队时,删去所指的元素,然后将加1并返回被删元素。

杜绝“假上溢”

和栈类似,队列中亦有上溢和下溢现象。此外,顺序队列中还存在“假上溢”现象。由于在入队和出队的操作中,头尾指针仅仅添加不减小,致使被删除元素的空间永远无法又一次利用。因此,虽然队列中实际的元素个数远远小于向量空间的规模,但也可能由于尾指针巳超出向量空间的上界而不能做入队操作。

为充分利用向量空间。克服上述假上溢现象的方法是将向量空间想象为一个首尾相接的圆环,并称这样的向量为循环向量,存储在当中的队列称为循环队列(Circular Queue)。在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。仅仅只是当头尾指针指向向量上界(QueueSize-1)时,其加1操作的结果是指向向量的下界0

实现代码:

if(I+1 == QueueSize)
{I = 0;
}
else
{i++;
}

利用模运算可简化为:

i = (i + 1)%QueueSize;

何时队列为空?何时为满?

因为入队时尾指针向前追赶头指针,出队时头指针向前追赶尾指针,故队空和队满时头尾指针均相等。因此,我们无法通过front=rear来推断队列“空”还是“满”。

注:先进入的为‘头’,后进入的为‘尾’。

解决此问题的方法至少有三种:

其一是另设一个布尔变量以匹别队列的空和满;

其二是少用一个元素的空间,约定入队前,測试尾指针在循环意义下加1后是否等于头指针,若相等则觉得队满(注意:rear所指的单元始终为空);

其三是使用一个计数器记录队列中元素的总数(实际上是队列长度)。

队列的基本操作:

数据元素定义

#include <stdio.h>
#include <assert.h>
#define QueueSize 100
typedef char datatype;
//队列的数据元素
typedef struct
{int front;int rear;int count;  //计数器,用来记录元素个数datatype data[QueueSize]; //数据内容
}cirqueue;

队列置空

//置空队
void InitQueue(cirqueue *q)
{q->front = q->rear = 0;q->count = 0;
}

推断队满

//推断队满
int QueueFull(cirqueue *q)
{return (q->count == QueueSize);
}

推断队空

//推断队空
int QueueEmpty(cirqueue *q)
{return (q->count == 0);
}

入队

//入队
void EnQueue(cirqueue *q, datatype x)
{assert(QueueFull(q) == 0); //q满,终止程序q->count++;q->data[q->rear] = x;q->rear = (q->rear + 1)%QueueSize; //循环队列设计,防止内存浪费
}

出队

//出队
datatype DeQueue(cirqueue *q)
{datatype temp;assert(QueueEmpty(q) == 0);//q空,则终止程序,打印错误信息temp = q->data[q->front];q->count--;q->front = (q->front + 1)%QueueSize;return temp;
}

取头指针

//取头指针
datatype QueueFront(cirqueue *q)
{assert(QueueEmpty(q) == 0);return (q->data[q->front]);
}

转载于:https://www.cnblogs.com/gcczhongduan/p/4296460.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

T(n) = 25T(n/5)+n^2的时间复杂度 计算方法

对于T(n) a*T(n/b)c*n^k;T(1) c 这样的递归关系&#xff0c;有这样的结论&#xff1a; if (a > b^k) T(n) O(n^(logb(a)));logb(a)b为底a的对数 if (a b^k) T(n) O(n^k*logn); if (a < b^k) T(n) O(n^k); a25; b 5 ; k2 ab^k 故T(n)O(n^k*logn)O(n^2*logn)…

android jar导出,Android项目导出jar包的小技巧

我们知道&#xff0c;可以通过如下设置将一个普通的Android工程转换成Android Library工程设置前后工程变化如下使用Ant编译时(通过android.bat update project 命令生成 build.xml)&#xff0c;普通的Android工程会生成apk文件&#xff0c;而Android Library工程只生成jar文件…

(五十九)iOS网络基础之UIWebView简易浏览器实现

【UIWebView网络浏览器】 通过webView的loadRequest方法可以发送请求显示相应的网站&#xff0c;例如&#xff1a; NSURL *url [NSURL URLWithString:"http://m.baidu.com"];// 创建请求数据NSURLRequest *request [NSURLRequest requestWithURL:url];// 向服务器发…

无心插柳OR志在必得?阿里推“来往”的意图

近年来&#xff0c;阿里巴巴在外围的动作确实不少&#xff0c;投资新浪微博、投资陌陌&#xff0c;配合阿里自身的一些战略调整&#xff0c;让人觉得这家公司似乎正在经历一场前所未有的“蜕变”。其实这也不难理解&#xff0c;在BAT三国演义中&#xff0c;任何一方都不能对其他…

wampserver的mysql启动与环境变量设置

安装好wampserver以后&#xff0c;mysql服务默认已经启动了。但是直接在命令行里输入"mysql"&#xff0c;系统会提示说 mysql 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 这是因为没有增加“mysql”环境变量,请跳到第3步阅读。 如果之前已经安…

华为mate30怎么申请鸿蒙内测,华为新系统启动内测,mate30系列尝鲜,网友:羡慕...

原标题&#xff1a;华为新系统启动内测&#xff0c;mate30系列尝鲜&#xff0c;网友&#xff1a;羡慕一款手机是否好用&#xff0c;其实取决于两个方面&#xff0c;一个是硬件&#xff0c;另一个则是软件&#xff0c;大家在购机的时候往往最关注的就是硬件配置&#xff0c;因为…

VMware 11完全安装Mac OS X 10.10

----------------------------------------- 引用原文如下&#xff1a; VMware 11安装Mac OS X 10.10_百度经验 http://jingyan.baidu.com/article/ff411625b9011212e48237b4.html VM11安装Mac OS X 10.10 工具/原料 1.VMware Workstation 11 2.unlocker 203&#xff08;for OS…

两个二进制数异或的结果

【面试题目 -亢龙有悔整理】两个二进制数异或结果是多少? a^b |a-b| (按位相减取绝对值&#xff0c;再按位累加) 两个二进制数异或结果 是 这两个二进制数差的绝对值&#xff0c;即表达为如下&#xff1a; a^b |a-b| &#xff08;按位相减取绝对值&#xff0c;再按位累加&am…

Xcode debug时如何查看内存中的数据

对于IPhone开发/XCode的初学者&#xff0c;如何在调试时查看变量的值是很头痛的事情。因为Xcode的expression 经常无法正确显示变量的值。但是强大的GDB可以很方便的帮我们查看变量的值。当执行到某断点时&#xff0c;在GDB窗口中使用po就可以查看变量.(po print object) 1&am…

android另类工具,[置顶] android应用程序开发另解及Android SDK工具集的另类用法

转载请注明出处&#xff1a;LouisWang http://blog.csdn.net/louiswangbing/article/details/6606865相信对于广大Android应用开发爱好者来说&#xff0c;Android SDK工具集的大家都已经能够很熟练的使用&#xff0c;但是我这里要介绍的是SDK工具集的非常用使用方法&#xff0c…

谷歌2007年上交大考试最后一题解答

N个整数&#xff0c;求其中任意N-1个数的乘积中的最大的一个。 例如 3,2,1,则最大的是3*26 提示&#xff1a;整数包括0和负数 要求给出个比较有效率的算法 &#xff0c;不能用除法&#xff0c;只能用乘法。 从网上找一了一个解答比较好&#xff1a;http://bbs.csdn.net/topic…

Dynamic Web Module 3.0 requires Java 1.6 or newer报错

在项目的pom.xml的<build></build>标签中加入&#xff1a; <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> &…

STL学习笔记5--map and multimap

Maps是一种关联式容器&#xff0c;包含“关键字/值”对。 Multimaps和maps很相似&#xff0c;但是MultiMaps允许重复的元素。 简单介绍&#xff1a; 1、声明&#xff0c;首先包含头文件 “map” map <int,string> test1,test2;//map <int,string>::iterator it1,it…

android让文件按顺序列表,Java/Android 获取文件夹的文件列表(file.listFiles())并按名称排序,中文优先...

排序规则由于是中国人&#xff0c;习惯性看中文文件夹放前面比较顺眼&#xff0c;因此在别人博客(https://blog.csdn.net/da_caoyuan/article/details/56664673)的基础上&#xff0c;加上了本身的排序规则。算法默认排序规则是按照ASCII码表排序(http://ascii.911cha.com/),排序…

用C语言写解释器(一)——我们的目标

声明为提高教学质量&#xff0c;我所在的学院正在筹划编写C语言教材。《用C语言写解释器》系列文章经整理后将收入书中“综合实验”一章。因此该系列的文章主要阅读对象定为刚学完C语言的学生&#xff08;不要求有数据结构等其它知识&#xff09;&#xff0c;所以行文比較罗嗦&…

【详解Java中格式化处理】

在Java中我们需要对一个数字进行四舍五入处理或者是对一个字符串进行格式化处理&#xff0c;我们需要使用String.Format方法或者其他格式化方法 一、Format方法 比如&#xff1a;DecimalFormat df new DecimalFormat&#xff08;"#.00"&#xff09;&#xff1b;S…

HDU4506 小明系列故事——师兄帮帮忙

问题链接&#xff1a;HDU4506 小明系列故事——师兄帮帮忙。 问题描述&#xff1a;参见上述链接。 问题分析&#xff1a;&#xff08;略&#xff09;。 程序说明&#xff1a;函数powermod()是快速模幂函数。 AC的C语言程序如下&#xff1a; /* HDU4506 小明系列故事——师兄帮帮…

1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例)

前言 在上一篇0_MVCEFAutofac(dbfirst)轻型项目框架_基本框架中&#xff0c;我已经介绍了这个轻型框架的层次结构&#xff0c;在下面的这篇文章中&#xff0c;我将以教师登陆功能为例&#xff0c;具体来扩充下我的core层的代码。 在这之前&#xff0c;我想先补充讨论下是否有必…

文字转语音+html5,JS实现文字转语音并播放

html&#xff1a;div>audio>div>js&#xff1a;function doTTS() {var ttsDiv document.getElementById(bdtts_div_id);var ttsAudio document.getElementById(tts_autio_id);var ttsText document.getElementById(ttsText).value;// 文字转语音ttsDiv.removeChild…

字符串的全排列和组合算法

全排列在笔试面试中很热门&#xff0c;因为它难度适中&#xff0c;既可以考察递归实现&#xff0c;又能进一步考察非递归的实现&#xff0c;便于区分出考生的水平。所以在百度和迅雷的校园招聘以及程序员和软件设计师的考试中都考到了&#xff0c;因此本文对全排列作下总结帮助…