00:00
各位,我们接着上前面的代码,继续来完成,刚才呢,我们把这一个数组模拟队列这个类我们写完了,现在我们来测试一下。我们测试一把好吧,那测试一把,首先呢,我们先初始化或者创建,创建一个队列。对象。创建一个队列,好,我就六了啊,六一个二。Q,没问题吧,大小呢,我们给它一个三,为什么我写一个三呢?减小一点,小一点,我们可以来验证这个队列是否满了,是否空了,如果我写一个30,我要验证满的话,我我得加30下太太慢了,对吧?好,我把这个创建起来。那现在呢,这一个对象好,现在为了验好验证呢,我们来创建一个K代表用户的输入。啊,这个是接收接收用户对不对,用户输入我写一个简单的界面好不好,那现在呢,我们要创建一个scanner。
01:04
就是我们的扫描器学过吧?好,然后system in。S点用一个标准输入,我们拿到一个扫描器。这个扫描器可以干什么呢?可以接收,现在呢,为了控制一个循环,我做一个loop。这个变量默认死循环,好,现在用一打显示菜单,我们输出一个菜单。啊,菜单,那菜单呢,我用外循环,这是一个老套路,同学们都会对吧,我写一段代码好打出这个菜单。怎么写这个菜单呢?这个菜单我们这样写吧,啊,我简单写写一个菜单啊show,比如说它输一个S在代表show表示什么呢?显示队列。好显示对下面几个我复制一下,如果这个人输一个E呢,代表他退出我们这个程序。
02:00
啊,代表退出程序。退出程序没问题吧,好,如果它输入一个A代表添加。就代什代表什么呢?添加数据到队列。叫做代表添加数据到队列没问题吧,下面呢,我们再写一个G叫get get叫什么呢?从队列里面取出去,从队列。队列取出数据没有问题啊,最后呢,我们再加一个HH,如果这个人他输的是一个h hi,我们代表他要查看。查看队列头的数据是不是很简单,现在有了这个菜单过后呢,我们来接收一下这个用户,他输的是什么?好,那么我用next。Next nine啊,不用next nine就next就行了,点try at0这句话是什么意思啊?接收一个字符串,接收一个字符,接收一个字符。
03:06
还还有印象啊,现在呢,我们用Switch来进行一个判断,他到底要做什么事情。好,如果这个用户他输的是一个S。好,下面呢,我们就调用这个Q啊,我们这个一个RQ。对吧,我们调用它的一个show方法就搞定了,就是显示嘛,如果下面我就复制一份了,同学们很简单啊,如果他输的是一个A。他如果输到A是不是要代表添加一个数据呀,添加一个数据,那我首先得给他一个提示,说请输入一个数是意思吧,输入一个数字数字,那么首先我就接收一个用value来接收我用scanner。代码很简单啊,我就不用太多做说明了。接收一个value,接收到以后是不是我就用这个Q。
04:01
呃,Q,呃,这个Q。RQ这个。RQ。点什么呢?点我们的一个爱的Q加进去就可以了。把这个value加进去。好,这个名字我们干脆直接叫Q吧。这样好好记一点啊,把这个名字改一改Q。就是队列的意思。好加进去,那如果说你在加的时候有什么问题,它会有相应的提示,因为在这个方法里边,同学们可以看到我们已然做了处理了。对吧,我们来看一下代码,如果他满我们会直接提示,而且直接返回加不进去对不对,好的,那现在呢,我们回头继续来写,如果这个用户他输的是一个G,代表什么呀,要取数据。取数据是意思吧,取出数据,那取出数据我们应该怎么写呢?对,大家都知道取数据这地方会有可能会有一个异常。
05:02
为什么?因为你你可能没有数据可取,对吧,所以说我们用。Java里面的异常处理机制,Try catch来处理一下,Try catch一下,那我开始写东西了啊,首先呢,我就是一个result等于。E对吧,用Q来取一个get q。好,直接输出。我就取出一句话,就说取出的数据是我们格式化一下,这个时候格式化呢,这样好看一点对不对?格式化取出数据是多少呢?百分之D。白嫖地,然后换行,这个白嫖地就是result,如果说我们这个get q抛出异常就会被catch抓住,那我在这输出这个异常信息不就完了吗?对不对?好,那么就直接。e.get message就可以了,大家看这句话能能看懂啊。啊,不要忘了一个break。这句话说我在取从队列取数据的时候,如果取到数据我就打印,如果在取的过程中抛出异常,那这句话是不会被执行的,直接被catch输出异常信息,这个异常信息就是我这写的。
06:14
我这写的这个异常信息能理解啊,好,这是我们的G这个操作,那下面呢,我们还有一个操作,就是一个H一个H,好我把这个也写一写H,这个H是干什么呢。就是查看就叫查看,不要取出了啊,查看队列头的数据是什么。这个队列头呢,它也有可能有异常抛出,因为队列也有可能会空,所以说我仍然是try catch1把。诶,这么我就上去啊,Try catch。把它带进去。那么仍然。仍然这样写,跟上面,呃,如法炮制。我们接收一个结果Q。点hide,诶这个不是哈西扣啊,Hide,我们的Q如果取出来过后呢,我们就打一句话。
07:08
格式化一下,格式化一下。我们输出这个队列。对,队列头的数据是单号低,同样换行。就real如果说在取投数据的时候,再查看队列投数据抛出异常,咱们怎么办呢?没问题,我们把它打印出来就可以了啊,1.get。SG完事。最后还有一个就是,如果这个用户输入的是一个E,就代表退出。他要退出这个程序啊,退出这个程序,那退出这个程序呢,退出之前我们先把这个scan关闭一下close。如果你不关闭,会有一个异常,它就会有一个警告,好,退出过后,我们把这个loop制成一个什么boss。
08:01
因为你把它制成一个false过后呢,它这一退出这一判断啊为false就退出来了,那么为了配合这个显示效果呢,我们在这个地方打印一句话叫做程序退出,好不好叫程序程序退出。没问题吧,同学们,程序退出好,现在呢,我们来进行一个简单的演示,看我们代码是不是已经可以运行了,来运行值,我把这个呢全屏一下。啊,应该没什么问题啊,代码都很简单的,跑起来跑起来好,首先呢,我输一个S,可以看到队列空没有任何数据,没毛病吧,我现在呢输一个A。他说请输一个数,比如说我输一个十。好,我再H一下,这个时候我们可以看到零队列头是十一二呢,现在因为你没有加数据,它是一个默认值,没问题吧,好,我们再来往里面加一个数据20。
09:01
好,现在呢,我再一下我们发现。是不是有个20了,我们再往里面添加一个数据,30没毛病吧,好在S我发现呢。三个数据都有了,大家都知道数据我统共最大为三,因此如果我再加数据,大家猜一猜会提示什么信息?是不是他说队列满不能加数据了,正确的?好,那现在呢,我们来这个S演示了,添加显示了,我们先一个G,我们我们先来一个H吧,大家看H队列的头部是不是十。是不是十啊,是的,第一个元素嘛,那现在呢,我们再输一个H呢,应该还是十不会动。对不对,因为H呢,并不是把这个数据弹出来或者叫取出来,他只是查看了一下,现在呢,我们用G。注意啊,即是真的从队列取出数据了,我输一个回车,同学们看取出十了,那么我问大家,取出十以后,我再用H查看,请问返回的是多少?
10:04
应该是多少呢?应该是20。因为这个已经被取出去了,头就变成了20能力眼。那你们可以来查看一下,比如说我输一个H,现在头是20了。是不是很轻松,好,现在我们再来输一个G,又取出这个,取出20,我再取一个G。是不是三个数据都取出来了,如果我再取,会有什么信息提示?队列为空。因为数据全部取出来了。这有空没法去了。是不是好,那说明我们这个代码是没有问题的。就代码没有问题,从目前来看代码没有问题,但是我要说,其实我们这个代码是有问题的。这个代码是有问题,为什么有问题?大家有没有注意观察我们这个数据,我们这种目前这个数组模拟队列有一个很大的问题,当我们数据从这取出来以后,队列头部上去了,尾部也在上面,那么这两个空间。
11:04
虽然没有数据了,或者说没有有效数据了,但是你也用不了。因为我们目前这个队列不是一个环形队列,没有取模,所以说你即使把所有数据取出来了,你再往里面添加也加不进去,因为你这个数组只用了一次,能理解吗?所以说你看如果我现在啊,我现在大家可以看到队列现在是空的吧。对的空,但是我往里面加数据,你会发现你加不进去。我也加不进去,它会提示队列已满,你看我加一个40。他说什么呀,队列吗?不能加数据,问题就是在于刚才我讲的,我们目前这种实现方法呢,它存在一个问题,就是数组用一次就不能用了。原因就是因为你没有曲模,没有做成一个环形队列,这是有问题的,那么我们待会儿呢会对这个问题我们已经分析了,要优化,优化成什么样子呢?我们要把这个数组模拟成一个环形队列。
12:07
也就是下面我们要讲的,把这个数组模拟成环形队列。关于数组模拟成环形队列呢,需要用到一点算法。那么这个呢,我们待会儿再说啊,我们待会再说,先把刚才讲的内容给大家板书一下好不好,就是刚才我们讲的内容板书,而且我也我也提出了,虽然我们用数组模拟队列已经成功了,但是呢存在一些问题,就是这个数数据呢不能重复使用。啊,不能重复数据使用,好现在我们再测一下这个退出是不是正确的,来我输入一个E。我输一个,一看看能不能正确退出,正确退出了。好的,那现在把刚才讲的内容呢,进行一个板书。好,刚才我们讲的内容是什么,我们捋一捋思路啊,同学们捋一捋思路。李律师。刚才我们讲的内容呢,是队列。
13:00
是不是队列啊,是队列吧,OK,给他了一个标题二。我们先讲了一个队列的一个使用场景,就是银行叫号系统。是不是银行?银行排队的一个小案例吧。让大家体验到队列还是非常有价值的。队列有价值,那么把这个应用场景讲完了过后呢,我们对队列做了一个基本的介绍。对不对,我们说了队列到底是个什么东西,那这里呢,我提了三点。那这里我们特别强调是队列是一个有序列表,一定要清楚啊,它是有序的,那么它是数组实现或者列表实现。目前呢,我们用的是数组实现,那么队列呢,它有一个重要的原则是先入先出的原则,什么叫先入先出?先存入的数据要先出,取出,后存入的数据后取出,就这个东西。要有个印象啊,后面我们画了一个示意图,帮助同学们理解数组是如何去模拟,或者用数组怎么去实现一个队列的一个示意图。
14:10
好,当我们把这个讲完了以后呢,是不是我们就对数组模拟队列做了一个思路的分析,就具体是怎么来玩的,对吧?里面有mark size表示什么意思,Front where表示什么意思,它有什么变化的对不对?好,我把这个呢也给同学们阐述一下,就是队列我们应该这样叫啊,叫数组模拟队列的一个思路。对吧,他的一个思路。好,那现在呢,我把这两点也给大家阐述过来。对吧,很简单。很简单,然后这有一个图,这个图上面是一样的,我就一样把它拿过来吧。好的,把这个说完了以后呢,我们又分析了一个,呃,往向这个队列里面添加数据的一个步骤,就是添加的时候会有一个怎样的变化,怎么去判断为空,怎么去判断队列满是不是好,这是。
15:08
又一个。分析的过程。好,那么我把这个呢给大家板述一下,这这有两个节奏是吧,两个步骤。就是诶,我把这个板书到这里啊,为了让大家以后比较好看。那这个说完了以后呢,我们是不是有代码实现了,是不是代码实现呢?呃,这个队列是具体是怎么做的,用代码来实现呢。那代码怎么实现的呢?同学们看代码,在这里我就直接将这段代码拷贝到我们的笔记中,以后呢,便于大家的复习,拿过来一看就知道了,对不对?好,这是对立的事情。后面我们还分析了问题,那么提出了问题是什么呢?我们现在还没有优化啊,还没有优化,只是把问题提出来了,我们的问题是这样子的,就是。目前这个数组使用一次就不能。
16:05
不能复用了,不能复用。好,这是有问题的,就没有没有充分的充分的利用数组。你啊,没有充就是这样的意思吧,就说目前这个数组呢,不能复用使用一次。就不能用了,使用一次就不能使用了。不能用了,就没有达到复用的效果。没有达到达到复用的效果。后面呢,我们要怎么改进呢?就是将将原来的代码,将这个这个呃,这个数组这个数组。呃,用使用算法,使用一个算法。把它改进成什么呢?改进成一个环形的环形的数组。啊,环形的数组啊,当然它这个核心是用一个曲模来实现的。那至于这个环形数组,就是后面我们讲的。
17:04
用。呃,我们我们讲的这个数组模拟,模拟这个环形队列,具体怎么做,我们在下一个章节来讲就是。用数组使用算法改进成一个环形的队列。环形的队列啊,环形的队列啊,当然在这个地方仍然是用取模的方式来完成的。取模的方式来完成,这边会用一个小算法。好,同学们,那关于队列的这个部分,就是代码实现的第二部分呢,我们就先给大家讲到这里,一会呢我们就讲解。这个环形队列是怎么实现的?大家注意认真听好,截取一段视频。
我来说两句