00:00
嘎拉基础的时候咱们就学过这个了。但你看还有别的方法,我就用这个,我已经把这个漏洞给大家补出来,为什么要这么写,我已经说完了啊。啊,事先我就给大家提到这儿了,好,那数示数就进去,那下面这个逻辑就要看了,如果是字符,如果是操作符,如果是啊,如果是操作符的话,我们就看当前有没有数,OK,那首先我们判断现在这个符号站是不是空的,这个能理解吗?For is pity。是不是我们写过这个呀,如果说它不为空。是不是我们就要去做一个复杂的处理?如果它为空,我们应该怎么写同学们?如果他为空这个符号。就直接怎么样入战,是不是刚才我们已经。在那个案例的时候已经讲过,怎么把这个符号直接入站呢?非常的简单,Op大点什么样?
01:04
Push。那这个时候push的CH,这这就没问题,为什么呢?因为你这个符号在你拿出来不就是加吗?加我当时整数,它就是按那个说的这个就没问题,能理解吧。它放进去过后,它其实放的是加对应的那一个。加号,你看这个加号对应的数字是43对不对,这个没问题,本身呢,我也希望他这么干。是不是这个没问题吧。好,这个地方就没问题,那里面最复杂的逻辑是在这里,就是如果当前符号站的优先级小于符号站,整这个有点麻烦。啊,这边开始来逻辑了,那要把这个地方第四个逻辑。进行处理了。好,这个稍稍的有一点麻烦。但是呢,咱们不怕啊,代码呢,就说数据结构,你你知道这个数据结构,那学数据结构也没什么东西,但是一旦应用你会发现好像学完数据以后,你还是做不出来。
02:06
就这样子的,老师你学了数学,我发现我的我的好像能力没有提升呢。那肯定的就是就是如果你学天天在学这个,学这个射门。你不经常去跑,你没有体力,那肯定是跑不起来的,好,那现在就开始玩这个事儿了呗,那就if。那首先我当前这个符号我就来判断嘛,Oper。他的这个优先级我们先拿到。是不是这个是,诶同学们,这个是不是我是不是我当前的这个符号的优先级啊。对吧,如果这个优先级。呃,它小于等于。我哪写错了哦,写错了,不好意思啊,对,刚才同学提醒我了,很正确啊,是一是这个优先级的方法,如果这个优先级它小于这个符号占的占比的那个符号优先级,那么我们就要运算,是这意思吧。
03:04
好,那是不是我们现在还要取出这个oper点,也要把它这个占顶的取出来,占顶是怎么取的呢?是不是oper.sta。里面的这个offer。点top。其实我这个写的有点啰嗦,是不是我们完全可以写一个方法,呃,写一个方法返回它暂停的内容就可以了,就跟我们前面写一个队列一样,就是把这个头取出来,但是不实不实际的把它弹出来。这个呢,我们待会儿再去做,这句话大家能看懂吧。凑合能看懂是吧,你看啊,这个就是你当前这个准备入站的符号的优先级,这个是你当前符号站的那个占领的。那个符号的优先级,如果它小于等于它是不是就代表应该计算了?好计算,那计算的时候是不是就根据我们前面的这个顺序要依次开始计算。
04:04
开始计算,是不是刚才老师已经讲过,就要谈数字了,NUMBER1先弹。注意这个顺序,从哪里弹,从数站里面先泡一个数据出来。诶。大家看。这个泡泡出来过后有一个问题。哎,非常的遗憾,这个问题来了,比较严重,他返回的是恩利,而我这边接收的是一个。Int问题很严重,为什么?因为你在定这个站的时候,你pop是个恩令。那怎么办呢?那第一种方法也就是改它。那改也不行啊,改也麻烦对吧,那现在我写一个比较简单的方法啊,同学们看一下。大家可能没有见过这种写法啊。这样就可以了。转成字符状,再to。转成自动状态读音的,那如果他这个。这个它返回这个数字出的,那这个结果就拿到了。
05:03
啊,这个也没有问题啊。啊,当然你也可以把那个泡泡方法改写一下。改写一下也可以,NUMBER2等于或者你或者你这做一个判断,If什么什么再加也可以,你也可以这样写。啊,If if怎么怎么样,再去写也可以啊,我就简单这么处理一下,点pop.to in string.to。拿到了,拿到这两个数据,再把这个符号弹出来,符号显然是要从符号在里面弹。好,这个没有问题,好这个地方呢,仍然做一个处理。啊,To一个int。最后我们就要开始计算了,Res计算的时候呢,我用哪一个都行,用符号站或者number的方法都可以,比如说我用number站的方法。点color,把number一传进去,Number二传进去,Offer传进去。好的,最后这个结果拿到了,这个结果拿到过后还要把它入战。
06:06
因为刚才我在给大家演示那个思路的时候,我已经说过,这入入哪个呢?入速战。入速战,不要忘了啊。入数字站,那入数站就是number。A number stuck.push。谁呢,R?不要忘了一件事情,当整个计算完了过后,你当前这个CH入账了没有?没有入场。还要把。把当前这个C入哪个站呢?符号站非常好,那入符号站呢,就是op.push。好把哪一个放进去呢?把我们的这个啊CH放进去就可以了。好,同学们,那这个代码就。写完了。啊,就是如果这个优先级小于它,那如果优先级这个是大家看这个呀,这个是不为空优先级就那还有一个逻辑啊,你不要忘了,还少了一件事情呢。
07:14
诶符号就直接入账,我这这个地方是不是代码写错了,这个地方是。啊,如果是一个。这个L是谁呀?哦,这个是代表它如果为空的情况。是不是就直接入账,那还有一种情况就是虽然不为空,但是你的优先级没有你,我这个优先级比你还高。是不是这个时候我就也是直接入账啊。你不要少了一个这个条件,首先这个符号就少少压一个东西进去,明白这意思吧。也要注意算,如果当前的这个符号的优先级大于。大于占符号站的符号占顶的符号优先级。
08:03
有先机,直接作战。优先级直接直接入账。好,那这个也很简单,就是oper。点push,你别忘了一件事情。好,同学们最困难的地方就写完了。那还有一段代码,同学们,你你在做这个工作的时候,If这一段到S写完了过后,你是不是还得让这个索引继续往下走啊,你还没写什么时候退出来呢,对不对?那所以说这个index还要后移。因为你在扫描吗?那index。虾。等于一后移一位后移移位是不是,你要判断是不是已经到末尾了呀。你必须判断啊,你判断的话,到时候这个数组都这个字符串都已经被你遍历完了,你还在那里傻傻傻的在遍历呢,不是数据遇见了吗?好马上判断是否到。
09:01
哪里了,到这个表达式的表达式的最后,那么你怎么判断呢?那就是index,如果它大于等于了我们这个的认识。是不是如果它大于等于这个地方了,其实它只有等于,它就不能再走了,相当于说你看啊同学们,如果这个index刚好。扫描到最后,这个index是不是应该等于这个N减一?那如果说你加完以后,它大于等于它的宿命。已经这个这个index上次已经把最后那个都已经处理完毕了,因此你这样不能再玩了,要赶紧break。好,赶紧break,那代表我们整个这个while循环呢,也要break able。好,各位同学,代码稍稍的有一点难啊,但也。不算太难。
10:00
因为你们将来参加工作还会遇到比这个。更麻烦的代码。那你经过这个训练以后呢,你再去看有些代码,你会突然发现,诶简单了。所以说有时候有有一个话叫做一览众山小嘛,假如说你将来看到代码都很困难,你发现他现在发再看一些代码,觉得这跟小儿科一样。好,这个代码我们就写完了,写完了。我们还有一个什么处理啊,同学们。这步处理了没有?你整个表表达式扫描完了过后,是不是这个站数站和服站里面还有东西,你没有进进行预算吧,OK,那第五一个动作还要继续进行处理,能理解吧?好,那下面呢。我们再进行最后一番处理,好代码已经有点不好看了,我先定位一下break到哪里结束,到这好代码应该在这里结束。好的,那同学们,那这一幕是不是又是一个外循环?
11:00
因为你不知道里面有多少东西。那同学们想。我们应该以哪个为标准来?决定我们这个是便利扫描完了,是不是当符号站为空的时候,我们就不要再做了呀?好,那就应该是这么写了啊。如果。如果我们这个符号战。Is empty pity了,就说你不停的取取取服站已经啥都没有了。那你当然就不能再玩儿了。是这意思吧,啊不停的取嘛,然后呢,这边这个进行预算。运算,那进行这个运算的这个操作是不是跟前面如法炮制啊。是不是我这个就不用再写了,把这段代码整体的扯过来。弹两个赞,然后计算把这个结果放进去,他不停的走走走,因为你这个oper oper上不停的弹,最终他肯定就没有了嘛。
12:01
好,整整个这个处理完毕过后,同学们。那当然,我还得用这个break包一下啊。BB。Break able。包一下,包一下,最后各位同学,结果就出来了。最后这个结果,诶,我们不要乱放啊,这么是代码怎么是,诶刚才。A。这是哪个地方的呀?是这样对吧,这样对不对啊,别骗我啊,好,现在我们这个最后结果就出来,我们把这个结果打出来就可以了,来我们写出这个结果。表达式我们直接啊。表达式,把这个表达式我们输出来。百分S。等于最后这个结果D。表达式是谁就是expression,结果是谁呢?各位,结果其实就是我们这个数站里面应该还有最后一个数。
13:05
如果没有这个输出代码,这个是错的啊,那么我们这样子,我们可以先把这个数弹出来。弹出来肯定他还有一个,就说如果这个代码没有出错的话,退出这个while循环,这个数站里面还有最还有最后一个字。啊啊对对对,呃,刚才有同学啊说的很好,哎,差点忘了,刚才有同学提醒提醒老师了啊,所以说我这个切果没有压回去,那要出问题的很好push许进去。因为你这个不压回去,到时候这个要出问题的。啊,这提的很好啊,还要压压住,因为刚才我们都,诶刚才我们压进去了没有。压了吧,诶压压进去了啊,这个不要忘了,刚才扫扫去了,压住啊计算这就还入账。别忘了这个事情,不然等会代码这个一旦错了,调试起来很困难。就是基本上你一旦这出了,你这个调试起来非常麻烦啊,那么我们把这个最后将。
14:03
将速战。数字站的最后。这个数,这个结果弹出。就是泡不出来。那抛不出来,我就随便写一个啊,RS等于。在于这个呃书站,书站的话是number点泡泡好,最后我们把这个二一放进去。这个res虽然是N,但是前面有个D,它会自动的进行一个转换,诶为什么这报错了,好因为这个结果前面就变得有了,好最后代码就这样就结束了,来同学们,我们运行一下吧。看这个代码能不能把这个最简单的。这个三加二乘以六减二这个结果给我们计算出来运行一下。好,看看会不会报错啊,有报错我们再谈一谈,一看到没有代码没有任何错误。说老师是不是我改一个数嘛,我把这个改成四,改成四的话,是不是24加三二十七应该等于25,对不对,运行一下看是不是等于25呢。
15:14
是吗?好,42458没骗大家好,这个代码就OK了,最基本的一个代码咱们就OK了。看,就是完完成,为了完成这么一个事儿,我们写了这么代码。那当然有同学会想啊,说老师你这个做这个题有什么意义呢,这个地方就是。告诉大家表达是是战的一个经典应用场景,因为站它有个什么好处呢?它可以把这个数和这个分开,分开过后呢,你什么时候用。哎,他可以先把那个原先不用数先压到里面去,在用的时候再弹出来。啊,这就是他的一个经典应用场景,那现在我们把这个写完了后,我们现阶段。
我来说两句