00:00
好的同学们,现在呢,我们已经有了对数组模拟队列的一个基本的思路分析,对不对,现在呢,我们来把它用代码实现一下,打开我们的eclipse,打开我们的eclipse,好,那打开过后呢,我们来一起把这个代码给同学们写一写啊写一写。好,现在呢,我新建一个包,新建一个包叫com.at硅谷。点我们的队列叫Q。对不对,叫Q。OK,好,现在呢,我们先写第一个小案例,用数组来模拟的一个队列,叫我就叫R。Or q?DEMOOK,这个就代表是用数组来模拟这个队列的。我们也就是说这个队列目前是用数组来实现的,明白我把主方法勾上。我把主方法勾上,那现在我们要做这个事情呢,其实挺简单哈,我们首先呢,先写一个类。
01:02
用先写啊,使用数组模拟队列能理解吗?比如说我们首先要编写一个类。编写。编写一个叫做A。Or q的一个类。OK,那现在我开始写代码了,Class,跟上我的思路啊,同学们,代码其实并不难。Class,那首先呢,我们这里面需要定义这么几个属性,第一个呢,就是刚才我们分析的mark。这个表示。表示我们数组的最大容量。最大容量最大容量。好,那么第二个呢,我们我们是不是应该有个有一个向指向队队列手队列头的一个指针呢?那就front来实现。刚才我们已经是不是做了一个分析front。
02:00
好。这个是指向对队列的。队列头没没问题吧,Private还有一个呢,就是我们的队列尾real。没问题吧,这是队列的尾部。喂。好,当然还有一个不可缺少的,就是那个宿主。数组我用这个来保存,也就是说这个是我们队列,呃,存的数据是存在这个数组里面的,就说该数组。该数组用于存放数据,能理解意思吧?模拟的队列就是它模拟队列。那刚才我们讲过队列里面最重要的几个操作,根据刚才我们看这个图,是不是你往里面添加你你加是不是你加。你加是不是当我点艾特的时候,其实是把数据加到队列里面。对不对,那么加的时候呢,我们要判断队列是不是为空或者是满,因此呢,我们先要做这几个最重要的操作,首先第一个创建队列。
03:08
的一个构造器,是不是要写一下构造器没问题吧,Public public r q。Public AQ。那你在定义的时候呢,你给我传一个最大的,就是这个数组最大的一个值max size没问题吧,同学们。给到我的思路啊,代码都very easy,那么size等于什么呢?就等于你传进来的这个值,比如说你给我传一个五,那么我这个队列里面最多有五个数据能理解好,下面呢,我们来初始化,就六一个int,大小呢,我们就是MAS。是不是要初始化?如果你不留一个,这个数组是空的,不能存数据,明白这意思吧?那么front我们要做一个初始化工作,Front根据刚才我们看这个图,是不是它在初始化的情况下是负一啊?
04:07
看这图啊,看图负一负一,那么rear呢,也是负一。RA也是负一,看清楚了,同学们。也就是说,这地方大家必须要明白一件事情,就是这个是指向。它是指向,诶这写啊,指向队列头部。头部。对不对,我们要分析出来它是指向队列头部的啊,而且呢,这个front呢,它是指向这个队列头部的,而且并不包含也说它是指向队列那个数据。数据的那个头部的前一个位置,因为负一嘛。对不对,负一好,这一点大家一定要清楚啊,就是说分析出来,分析出分析出这个front是。是指向队列头的前一个位置。
05:05
前一个位置。前一个位置,明白这意思吧,就说你现在等于零,当你还没有往里面添加数据的时候,其实它是指向队列的前一个位置,那么这个RA呢?是指向队列的队列尾哦,队列尾它是指向指向队列尾的具体的一个位置就是它不是指向队列尾的。呃,后面,而是直接指向队列的尾部。哦,指向队列的尾部,指向队列尾的这个具体的数据了。大家再再理解一下什么意思啊,就是front,它是指向队列的数第一个数据的前一个位置,而队列尾这个RA呢,是指向队列尾部,是包含队列尾这个数据的,即。即包含,包含,包就包含这个即就是队列。
06:04
队列最后一个数据。最后一个数据。这是我分析出来的啊,就是我们在做这个负一来做这个,呃,初始化的时候呢,我们会有一个呃,事先约定的一个规则。啊,如果你你含不含,你含这个数和不含这个数,你比如说有些人上来,他是初始化为零。那含义就不一样了,我这写的是负一,就是这个含义,明白我的意思吧。啊,大家后面听听就明白了,好,那现在呢,我们现在再写第一个判断队列是否满,同学们判断队列是否满,我写一个方法叫。E什么呢?负,那我问大家什么情况下这个队列是满的?哪个同学能想起来什么情况下队列它是满的呢?是不是这个条件满足就可以了?Re return RA,如果等于max size减一,能分析出来这个这个东西吗?
07:07
啊,当然是瑞,应该是等号,就说当我们这个re尔已经等于max减一了,那说明我们的队列已已然满了,如果它不等于MAXX30减一,说明还没有满,明白我的意思吧。这个就代表是否已满,下面呢,我们再来写一个方法,就是判断队列是否为空。哪个同学能告诉我什么情况下队列是空的呢?哪个情况下对空呢?好,我们来写一下public bully。不利。一是。ET,那什么情况下为空呢?同学们看,打开这个图,是不是当RA和front相等的时候,它就是为空的?就是说当RA和front它们相等,说明这个队列没有数据,你看初始化RA等于负一,Front等于负一,这个时候有数据吗?没有数据是这意思吧?所以说我们可以这样来写一个,就是如果real它等于front。
08:09
对不对?那么这种情况下我们就认为是空的,好,我们再来写它的一个重要数,添加数据到队列,请问这个方法怎么写public,我们写个贸易的爱的Q。啊叫at q,那你在添加的时候,你是不是应该给我一个数据啊,我用一个N来表示,那你在添加的时候是不是首先判断队列是否满,如果队列满你还能加数据吗?可以加不进去,比如说你有五个空间都已经。都已经全部满了,你还能加进去吗?加不进去,因此呢,你要做一个判断,怎么判断一日four,如果它已经满了,对不起,我们就不能加入,不能加入呢?我提出一句话就行了,就说队列满。队列嘛,不能加入数据,能理解我的意思吧,啊,不能加入数据数据。
09:05
那这个时候不能加入,那就直接return就完了,那如果说队列没有满,是不是就可以加入,那加入应该怎么加,刚才是不是已经分析了在加的时候这个rear。会跟数据的输入而改变,那应该怎么做呢?首先把这个RA怎么样。加加。是不是re往后面移动一下呀,是不是后往后面移,就是说让让这个re后移。后移。后移,后移完了过后呢,我们把这个数据加进去就可以了。怎么加八一放进去,当然你也可以把这个加加呢,直接写在这个加加,写到这的地方也是一样的,说老师我这样写可不可以一样的,只是我为了思路清晰一点呢,我把它分开写,明白这个道理吧,好,这是添加数据,我们就写完了,有添加数据是不是就应该有获取队列的数据啊,获取队列的数据。
10:06
或者叫初队列,就数据出队列,出队列,那我问同学们初队列应该怎么写?是不是相当于我们这个图。第三个图,那么出队列肯定是从front这个位置开始取,能理解吗?就加数据是RA后部,那么取数据是从front取,能理解啊,那现在我写一个方法叫public,那么肯定要返回一个int嘛,我叫get q。代码其实是不是很简单呀,同学们。那么你在取这个数据的时候,是要判断队列怎么样,队列是否空,如果队列是空的,你能取吗?同学们一个数据都没有,比如说第一种情况。现在一个数据都没有,你是取不出来的,你能要取的话,肯定是报这一个数组越界,你不能从负一取东西吧。因此呢,同学们,我们先判断是否为空加一个一是NPT,如果它是一个NPT,好,这个时候呢,我们就不能取东西,不能取东西我就直接抛出一个异常,你不能这样说,老师,如果为空,我们返回一个负一不行啊。
11:17
呃,因为有些同学喜欢,呃把那个查找数组那个下标跟他混起来,那么如果你返回负一,那也也有可能也就是负一这个值啊,因此呢,我们要通过抛异常来处理。通过抛出异常来处理,怎么扯呢?入new一个runtime exception。写一个。提示叫做队列,怎么样队列为空?队列空不能取数据对吧,不能数据能理解啊同学们,那么有些同说说这个实用完了之后需不需要马上return,找个同学说一下。这个return不能写,为什么?因为啊,实际上这个事本身呢,它也会终止,它也会马上呃,马上返回,所以说这个return呢,没有必要再写了,明白这意思吧,所以你看,假如你在这写一个别的话,比如说你说我输完了,给我打一句话,这地方会报一个什么呢?Unreableable code就是不能到达的代码,那就意味着实入本身会直接导致我们代码return。
12:22
所以说没有必要再写这句话了啊,这是个基础,同学们简单理解一下好,那如果不为空,是不是下面就可以继续写了呀?不为空我们怎么取数据呢?Very的easy,是不是把这个front往后面移一下呀?因为你要取的时候是我们刚才讲过,Front本身它是指向队列的前一个位置啊,也就它是指向队列头的前一个位置,那么你要取的话,先要把front加加,比如说让这个front后移一下。能理解吗?后移后移我们就可以把数据返回了,对吧,那就front。
13:01
对,Front把它返回去,代码写完,这个就是获取队列的数据,也叫出队列,那下面呢,我们为了演示这个效果,现在应该再写个叫显示队列的。所有数据。我们要展示一下吗?所有数据,比如说我想知道当前队列到底有哪些数据,我们来看一看public void,我叫show或叫历史的都可以啊,比如说有名叫list list也行,我就叫show吧,Show q。那其实这就是个简单的便利。就是简单便利,那便利谁呢?显然是便利,我们这个数组是不是代码非常简单啊?好,现在呢,我们先来做一个小判断,如果队内已经为空了,显然无法便利。都已经没数据,你编辑啥呀,所以说我们打印一句话对不对,打印什么叫做队列空的空的没有数据完事。那这个时候呢,就不用往下走了,是是不是,那如果说它不为空,是不是我就可以遍利它了,对不对,那就是点认识,我把这个数组呢,给大家打出来就行了。
14:11
怎么打非常的简单,我格式化一下对不对,百分号我就这样写啊,按照格式写百分号D,这个D代表是它的下标,能理解吧,然后呢,再把数组取出来,最后我们换一行,那第一个。百分号D应该是谁呀?就是我们的I数据在哪里呢?叫R里面这个I是不是就完事了,是不是特特别简单,代码就写完好,这是我们显示队列所有数据,那到此为止呢?同学们,我们就把一个数组啊,就用数组来模拟队列,最基本的部分写完了,我们有构造器,有判断是否为满,是否空,有加数据,有取数据,有显示队列,那么我们再加一个方法啊,再加一个方法是显示队列的头部,头数据是多少。
15:07
但是这个不是取数据啊,注意注意注意,不是不不是取出数据能理解啊,不是取数据只是显示队列的头头数据是谁就是对头是谁,不是把数据取出来,那么我写一个方法叫int。没问题吧,那叫hide q,有些地方写的方法形容叫pick也可以,就偷看的意思对不对?我就叫hide hide。呃,Hid q就是投数据啊,那现在呢,我们来做一个操作,首先还是要判断,如果现在它已经为空了,那显然就没有投数据,我就直接呢。打一句话就行了,队列空的没有数据。那队列空没有数据,你显然没有办法去返回任何东西,对吧?所以说这个地方干脆我们就抛一个异常就可以了。
16:06
给大家一个异常嘛,就肉TH肉又一个runtime。Exception这个异常的信息就是刚才同学们看到的这句话。理解。好,我把它放进去,那这句话呢,我就不要了,好吧,不要了,那如果它不为空,我们就把这个投数据返回去就可以了,怎么返回R的front怎么样加一别忘了啊。别忘了加一,因为刚才我已经做了这个分析了,格式化一下啊,格式化一下就说为什么要加一,刚才已经讲了啊。加一的原因是因为方它本身指向队列头的前一个位置,并不是直接指向队列头的第一个数据,再说一遍啊。好,同学们,那害的我们也讲完了,那现在呢,关于一个最基本的数组模拟队列。我们就说到这里了,那下面呢,我们准备写一段代码来验证我们这一个数组模拟队列是否正确,好,那下面那段代码呢,我们放在下一个视频为大家讲解,先把这个捋清楚了啊,代码是不是还是很清晰的,就是照这个图来写的。
17:16
好,我先截取一段视频。
我来说两句