00:00
可能有点打脑袋啊。好,我们看一下,下面呢,我们就来讲一个实际的一个应用了,那就是这个站的一个综合计算,那看这代码看起来都比较。麻烦是吧,好,我们我们先还是根据我讲课的一个习惯,先把思路给他分析了,我们在代码实现。好,大家先看一下啊。嗯,用站来实现综合计算器。那同样我们借助。这个Excel文件来说这个事儿。首先呢,我们先把这个计算要计算这个计算式给他拿过来。比如说我们先。写一个最简单的计算,比如说现在有一个计算式。是这个,待会儿呢,我用一个表达式来记录expression。记录下来,他肯定从外部接收到,是一个字符串。这个大家不用怀疑,肯定是个字符串。好谢谢啊,好谢谢好,这个地方是一个字符串,那是一个字符串,待会我们怎么去做呢?我的思路是这样子的,同学们注意听我的思路,这样子第一步。
01:08
我首先要设计两个站。我要设计两个站。设计两个站。设计两个站,一个站我们叫竖站。一个叫速战。一个叫符号站。说老师你怎么知道这么设计呢?我肯定备课了啊,如果我没备课,我上来讲,我是讲,我也做不出来。你不能,你不相信,你随便找一个了,找一个人,他即使工作了56年十年,他只要不只要以前没做过,他也没办法的。因为这个它确实需要要动动脑筋的,我待会要设计一个数站,设计一个符号站,那待会儿呢,大家先把这个思路走清楚啊,那待会我这个站呢,假如我我是长这个样子的。假设这是我的一个赞。
02:02
再来一个赞。好,那为了以示这个区别呢,我给大家画一个不同的颜色啊,这个呢,用这个颜色。好,这个呢,我换另外一种颜色,蓝色的。好,那么待会儿呢,我把这个站称之为速战。就说这个是速战。速战。好OK,这个这个站呢,我们把它叫符号站。符号站。符号站好这两个站呢,我我们准备好了,那现在呢,第二步我要干再干点什么事呢。这稍稍有点麻烦。就是第二件呢,我要开始设计一个索引进行对这个对这个进行扫描。就是我要对这个表达式进行一个扫描。对什么呢,对。
03:00
这个expression不填写。这个进行扫描。啊,那么其实大家也不要觉得扫描好像很吓人,就是有一个索引不停的在那吃,我一个个取。我一个个取你,因为你在计算机里面,它并不知道这个三四符号还是一个数字,对吧,所以说进行扫描就是一个一个的取。一个一个的去。好,这是第二个好,现在呢,第三步当取出的,取出的这个字符。四。什么呢?注意听,取出的字符是数字时。数字时。数值时。啊,就。数值数十。就直接就直接入速战。速战,这个就是算法。就是你现在动脑筋,你在怎么做,你是在设计算法的,他这个有算法吗?就这样子的。
04:03
啊,就是如果我从这扫描,待会呢我会设计一个index索引,待会呢我有一个指针。这个指针呢,我的名字就叫index。就是我在这儿不停的扫描。那么我如果发现是一个数,那我怎么知道是数呢?肯定我要判断呢,我不判断我怎么知道它是数啊。啊,如果取出X个数,我就直接入数站。好,那么问题来了,如果你取出的字符它是一个符号,怎么办呢?这就麻烦。因为符号里面有加减乘除,它还涉及到一个优先级的问题。哦,我这还写的很简单啊,我还没写小括号大括号。那九个大大国上去就更难了。因为我主要是用这个来让大家体验这个站的一个应用,好当取出的,取出的字符是。符号是。哎,这个地方我们的逻辑呢,就要开始分了啊。
05:03
就是分成下面好几个逻辑来看,第一个第一个弯,第一个第一个啊4.1。当取出的字符是符号时,注意听。如果当前。如果当前这个符号战。没有。没有这个数据符号站假设是空的。没有没有数据。就直接入站。好,第二个。第二个,如果当前符号占符号。如果当前符号的优先级。优先级它干什么呢?它小于等于。符号站的符号站的站顶。
06:02
符号站的站顶的这个符号的优先级。优先级则。则干什么呢?则从。则,则将则弹出,则取出。该符号。并从速战。并从速战。诶,这个数啊,数站依次。依次弹出pop出两个数据。跑出两个数据进行进行运算。进行运算。将结果。将结果。重新压回。重新push到。这个速战。速战。速战。
07:00
再将。再将当前这个符号。压入。Push到。这个符号站。可能大家已经听听不明白了,是吧,老师应该说什么了,对吧,我知道大家可能听不太明白,因为其实这个已经是讲的很明白了,待会呢走代码就好了,好最后第五一步,我要说的最后一步啊,当你整个计算完了过后呢。最后计算完了过后。完了过后这一数站和符号站可能还有数据。最后一步就是当。当整个,当整个整个这个表达式表达式扫描完毕。啊,扫描完毕后,完毕后就依次。从这个速战。速战。和符号站。
08:00
符号站取出数据。进行预算。进行运算。最后。最后在这个速战中速战。数站中的数据。数据就是结果。好了,同学们,我这样讲可能大家不明白,我们现在按照老师这个思路呢,我们来走一下这个代码。走一下这个逻辑啊,我们来走一下,好,同学们根据老师思路,首先我们开始扫描。Index。首先它扫描一个三。首先他扫描一个三没问题,那三呢,我们就把它放入到这个站中。因为它是个数,没有什么可说的。好的。符号加,诶加现在符号上是空的。符号站是空的,符号站是空的,那就没什么可说的,诶这个上面那个上哪去了。好放我上面上这个符号站,符号站现在是加号,加号其实啊,你看我们眼睛能看到。
09:07
其实你在程序里面还判断。而且我现在考虑的只是。一个数字假设三个多个数字,那这边还要还要做处理啊,这就你程序员要做的好,现在加呢只有一个,那就没什么可说的,直接入账。因为你还没有办法运算呢。好,紧接着他又发现二,我我讲了这个二呢,没什么可说的,他数字那就直接入账,没什么可说的了,那现在大家看到我们的占顶啊,在我们这边呢,应该有个占顶。同样的道理,你这边呢,也有一个山顶,这大家能理解对吧,那紧接着呢,我们发现一个。称号。OK,好,乘号你要小心,因为乘号它它当符号占的优先级小于等于符号的这个优先级才进行运算,但是乘号的优先级是大于它的。
10:02
是不是如果大于它的话呢,我这儿还少了一句话,如果大于它啊。就直接入战。因为大于它说明后面那个数还没进来呢。对不对,那么如果当然反之,我就我就写个反之啊,因为我这没有太多的语言了,反之反之。反之就是符号直接直接入符号站。那也也就是说,也就是什么呢?也就说这个乘号你不要不要着急,因为这个后面这个六还没少到这来说你现在这个乘号呢,往上面挪一下,把这个乘号也。入账能理解了吧?好,紧接着又是六,六,不用犹豫,六是数字直接入账。那也就是说这个这个箭头就指到上面来了。急着减号,哎,各位同学要注意了。减号的优先级和这个乘号优先级谁高呢?显然,陈号叫要在小学都学过。
11:01
好,小学你们都学过的话,那显然按我刚才说法,就依次从数上弹出两个数据。并进行运算,再把结果重新铺到数上,那就说弹出来六二和六是不是弹出来了。弹出来过后,这个站是不是到这来了,到这来了过后二乘以六,这个结果是不是等于12 12过后再入站是不是同学们。是不是这个就12了,同时这个乘号是不是也也被我弹出来了,我才知道是乘号吧,肯定我要把这个,你看吧,我要取出这个符号吗?那这个这个是不是也被也被干掉了。是不是就它又回到这了,回到这儿我们再一扫描,是不是有个加有个二。是不是,诶不不,我是不是还要把这个当前符号站还要push进去啊,因为减号你还没用呢,减号好紧接着扫描二二十个数又进去了,好整个这个扫描完毕过后。是不是整个表达式扫描完了,扫描完是不是你的数站和符号站里面还有进行没有进行运算的结果呀。
12:07
好,这个时候呢,我们就开始进行一个操作,什么操作呢?就是按照这个顺序来做,弹出一个12和二,当然你要注意这个减数和被减数的顺序,肯定这个数是要在前面的。是不是也就它减减法是后面弹出来的那个是要作为减。后面弹的是被减数吗?是减数吧,对吧,那就应该是12减去二,就是弹一个12,弹一个二,再从里面减减就相当于这个减减法被弹出来了,这个12和二弹出来了,弹出来过后是不是我一运算又把它压进去。压进去过后,是不是这还有个加法,又从这弹一个加弹一个,这个弹两个数出来,弹两个出来过后三不是在这来了吗?好,弹出来过后是不是弹了一个十和三啊,再把这个加号弹出来,加号弹出来过这个是不是又得到一个又是13。
13:04
好,这个当然里面这个数据也没有了,就符号站肯定要清空。最后得的结果就应该是13,而这个结果呢,的确就是13。这个结果就出来了,思路大家清晰了吧,而且我这个思路呢,还有点bug,但是现在我们先不去把那个说的那么细,先把最基本的思路说完了,我们就来实现它。好了,思路有了,看讲思路清晰了,过后你就知道待会老师要干什么事了。好思路了,我们先截段视频。
我来说两句