00:00
那下边呢,我们接着来走这个东西,那现在哈,我们已经有了重要的三个工具方法,哪三个方法呢,大家可以看到,就是刚才我们增加的一个是判断是不是一个运算符,第二个是进行这个运算的方法,还有一个呢。诶还有一个就是判断优先级的这三个方法,就说你得分析出来有这三个方法,这个本身就是需要去动脑筋的,就说你怎么知道有这三方法,一般的一般的这个第一次做这个做做这个人他首先算法他都不知道怎么做,等到把算法分析出来过后,代码他也很难实现。说这个还是有一定难度,就是有一定难度,那么我们现在接着往下走吧,好,那现在呢,我已经到了哪一步了,诶现在扫描了,扫描出来一个,但是扫描出来的东西同学们要注注意啊,它是一个单个字符的字符串,它是一个字符串哦,注意听它是一个字符串哦。
01:01
它是一个字符串,只是说这个字符串里面呢,只有一个字符能理解,那你现在你想一想。你现在的问题是已经扫描到了。那你首先判断它是不是一个数字,当然是,如果它是一个操作符,它就不是一个数字了吗?对不对,那现在说也可以理解成判断是不是一个操作符,那么我们就来做呗,那你判断它是不是一个操作符,不是这个方法吗?但是你要传进去的是一个value。问题来了。问题来了。你怎么?把这个字符转成对应的这个int值。比如说。注意听这个这句话啊,现在你扫描的这个值,比如说同学们看到现在你扫描了一个这个东西,你扫描到了一个字符算式加号。那你现在得把这个加号想办法给我转成什么玩意儿?
02:01
转成这个43。这本身就需要大家动脑筋。如果是,如果是这个Java语言呢,它相对比较简单,它是本身就可以通用的。直接往里面一扔就完事,但是更圆里面稍微麻烦一点,要这么做啊,同学们注意听,要这么做。啊,我现在先把它处理一下。首先它是一个字符串,你先把它转成一个切片,因为我们知道字符,呃,字符和这个BAT是一个对应关系,因此呢,你先要这么做,大家看我写完,大家看能不能理解,我先把它转成一个BAT切片。这个明白什么意思了吧,也就当我转成一个切片的时候,你假设是个加号,其实它已经把你里面这个加号转成那个BAT了。明白这个意思,然后你要取的呢,是第一个。因为他并不知道你这个CH里面有几个对不对,那你要取第一个,因为它还是一个切片嘛,你要取第一个,取完了过后各位同学你还要把它转成就可以了。
03:12
这个temp就是43,而且它类型是int,如果你不转成一个int的话呢,它是一个bit,是一个单个bitt,你传也传不进去,你还得转,所以说这个就拿到四四十三了,这个相信大家这个就是这个就是字符对应的阿斯克玛值。好,这个地方是一个基本功啊,以前老师在讲Java,在讲构语言基础的时候,我是讲过这个点的,如果你们这没有突破,你是去把基础打开看一看。啊好,有了这个东西呢,下面就比较easy了,If。If,什么呢?好,调用我们的这个方法,那么现在这个方法呢,大家看到啊,我们写的方法都是跟这个站关联的,那你用哪一个站的实力来调用都无所谓,你用这个站来调用。
04:02
你用这个数站来调用,或者是这个符号站都都无所谓,那我干脆就用符号来调用,注意啊,这个用哪个站调用,因为是用它的方法嘛,所以说我就用这个符号上啊,注意听。我用这个符号段来调用它的一个方法叫is up。当然有些作老师,我能不能用书上掉这个方法也可以。也可以,但是因为它是符号嘛,所以相对来说我用它更贴近一点,我把这个temp扔进去。我把这个衬布扔进去,好,扔进去过后,好同学们扔进去过后,那么这个时候如果进到这里面说明。说明是符号。那么没有进来,那就是else,注意听这这个逻辑还是有点麻烦啊,如果他是else,说明它是什么。说明是数好,我们先处理,简单的大家都知道,如果是一个数的话,我们直接把它扔在数站里面,还记得吧。
05:00
啊,那么也就是说这个时候你只要需要找到这个number。找到这个number,然后呢,调用它的一个方法叫push。因为这个站呢,我们是测试过的,没有毛病,所以说直接把它放进去,把这个temp扔进去就可以了。好,把这个temp扔进去就可以,就把这个值就扔到这里面去了,大家看清楚了啊,这个temp咱们就扔进去了,好没没有问任何问题,这个temp放进去,因为它已经转换成一个int值了嘛,好,那如果说同学们看到。如如果说啊,如果说现在。啊呃,应该接着往下走,那么倒到这里面去了。这里面如果是符号。又分两个逻辑。这边有两个逻辑。两个逻辑,哪两个逻辑呢?刚才我们分析过了,看到没有,这个时候你突然发现这个思路是多么的重要。如果你这没前面老师没有给大家分析这个思路,我就直接写个代码,我估计。
06:05
除非你曾经学过,不然的话,你不知道我在写什么了。啊,两个逻辑,刚才我们说的两个逻辑,第一个逻辑是。第一个逻辑是这个逻辑,我们先把这个逻辑搞定啊。所以看情况啊。先先判断啊,先是这个啊,还还不是第一个逻辑,还是先把这个逻辑走了。如果是一个空战。如果是个空战值,算是一个运算符了啊,如果是一个空战。这些逻辑还挺多的。就如果是运算符的话,我们先判断oper是不是空站,如果是空站就直接入账那价if。就这面再去判断,那么我怎么知道它是不是一个空战呢?非常的简单,我只需要判断它的那个套。就是这个站的top。它等不等于它现在它等不等于这个op stack。
07:00
他的这个max。Max top减一,当然你也写,可以写个方法,我这因为没写方法,我这就只能这样先写了啊,你们可以写个方法,就说如果op.top等于了啊,就是oper STa.top等于op.max top减一说明它是一个。说明它目前是一个,哦对呃,是个空站的话,应该是等于负一啊,这样子就行了,叫oper大点top,它是等于负一,说明它是个空站。对吧,它是一个空站,如果它是一个空站的话呢,这个就这个符号,这你你这里面判断它是个符号吗?那就直接把这个符号入站了。入战,那就是oper。Oper star店铺是。把谁入账,把这个temp入账。因为你现在已经把它转成一个整数了,就入账了,没问题啊push哦,还少了一个。
08:01
多了一个T,对的。好,这个就放进去了啊,放进去了,那么如果他不是一个空战的话呢,又要分逻辑。分什么逻辑,我们来看看,如果它不是一个空战的话,就是有两个逻辑,一个是这个逻辑,一个是这个逻辑,好的,那先判断这个逻辑。好,你看这个现在大家可以想象到这个思路是多么重要啊,如果没有这个思路的话,我们估计现在。我我说实话,我我自己都不知道怎么写。那你你肯定也不知道怎么听了。现在至少我们还有个铺垫好,现在呢,你就判断当前这个offer sta,就是它占顶的运算符是不是跟它大,那就很简单判断就行了嘛,我们用这个op stack。点他的这个优先级这个方法。先把他的优先级取出来。取出占顶的那个,就占顶的那个值,就他现在占顶的值,它占顶的值其实就是oper。
09:06
追听。点。Are?走。Opera跌top。看大家能不能理解,就是这个地方就是取出站没有取出,只是看一下,没有取出来,没有弹出来啊,只是看一下,就说我看看你这个站里面的这个就是符号站的那个站顶的那个那个符号它的优先级是多少,如果说它大于等于。它大于等于什么玩意儿呢?大于等于当前的这个好,那当前这个也比较好处理。就是这个运优先级。优先级括起来,你当前这个不就是痛苦吗?你temp是一个数嘛,你已经把它把这个符号位转成一个整数了,它刚好就可判断,如果满足这个条件没问题,这说明。
10:03
这说明现在这个条件满足就要走谈谈数了,那谈数的话呢,谈两个数,那谈两个数的话呢,我们就定在外面直接定,定一些内容,不要写到这里面去顶到这里面,每次都要去定义,不划算,所以说为了配合运算。为了配合。配合运算运算我们定义需要的变量,哪些变量是我们需要的呢?首先有两个数我是需要的,我先初始化NUMBER1NUMBER。同时我们还要拿到一个你弹出来的一个offer,因为你预算的时候需要一个offer,所以说我把这个offer也弹出来。也是一个是一个整数啊,我们都把它做成一个整数,最后呢,还有一个结果,我们也把它result好,这是我需要的四个变量开始用了啊。谈。先从数站里面弹两个数出来。
11:00
速战。是这个number站。大家放心啊,你只要走,走到这里面,树站里面一定有东西。你放心,不可能没有。如果没有的话,只有一种可能性,你表达式写错了。他一定会弹东西出来啊爆,因为刚才我们算法已经通过了,证明好再弹一个出来。注意啊,他你想象是发生了什么事,你得想象刚才老师分析的这个流程。OK,好,弹出来了,过后再弹一个预算符。这个预算符要从哪弹呢?要从这个oper弹,一定要把它弹出来。出站好,弹出来过后,注意现在呢,有了两个运算符,还有还有有了两个数,还有一个运算符,这个结果我们就可以直接调用这个站里面的一个方法。这个站里面我们刚才写了一个开了这个方法还记得啊,这个是专门用来做运算的,所以这个结果这个函数对我们很有用,填进去NUMBER1。
12:04
Number。然有offer,注意你这个是给,给这个数的顺序,一定要是按照这个弹的顺序给,因为你里面你你在里面写的时候是已经把这个顺序颠倒过来了,如果你这方错位的话,整个结果刚好相反。因为我这是NUMBER1 number2是c number1是代表这个,呃,这个后面就就就就先弹出来数,所以说呢,这个地方我们就先把先弹出当成NUMBER1,如果你这个顺序不对,也也是要出问题的啊好,弹出来过后,我们先来把这个结果再压进去。这为什么报错?啊,没有没有报,诶为什么报错。Pop,哦对了,这个pop呢,它会弹两个,一个是number,还有一个就是error,这个error呢我忽略。那个error忽略我。不要对同学们。这个也是一样啊,我我忽略好这个就不会再报错了,然后呢,这个算出来过后还有一件事情啊,你得把这个result再重新压入到书站里面去,大家不要忘了这件事情啊,把运算结果要重新入账到书站。
13:15
这个这个我们在前面已经做过算法分析了。好,所以说呢,这个时候呢,我们在做一个非常重要的作用,入账将计算的结果。计算结果重新。重新入站。入数站啊,入宿站不不是别的站,那你怎么把它入进去呢?就是number sta,点我们的push。故事谁result?把它压进去,压进去过后没有完,还有一件重要的事情,你还得把当前这个符号站再入站,因为你个当前符号站你还没有,也还没有处理呢,你只是你只是把原先那个符号站里面有弹出来,你算了一把你当前这个孩子压进去,不然的话少了一个运算符你也不得了。
14:01
好,它底层就这么做的啊,那么这个时候紧接着把当前的当前的符号符号。符号压住。压入。压入哪个站呢?压入我们的符号站。符号称。好,没有问题,那就把它压进去吧,Op。点push push压进去,把谁压进去就是当前,这个就是temp。因为你已经把它处扫描到了,到了压进去了,好这个时候我们已经把这个逻辑处理完了,别忘了还有一个逻辑就是如果他这个优先级并不大于准备准备入战的,就是里面这个他没有你的大。没有没有大的话,那怎么办呢?我就我就直接把运算符运算了,就跟刚才那个情况一样好,这里还有个L的关系。就在这里面有个else的关系啊。那这个时候应该怎么样呢?不用犹豫,直接把他入战。
15:05
好,同学们。同学们,咱们现在就把这个逻辑。走完了。但是。但是这个第七个逻辑没有处理,就是你整个做完了以后,不是在里面还留了一些东西吗。那这个时候就要根据刚才老师的分析,一次从符号站中取出,那你这个地方啊,对刚才还少了一个重要动作,你这你这只取了一个就跑了,做循环永远是死的,看取了一个,取完一个过后,你做完一个,对这个,对这个符号取出来东西做了处理过后,你就跑了,不行,你还得往下继续取。继续。啊,继续扫描。那么你继续扫描,你怎么样体现出继续扫描这个特点呢?就是那个index要加加。注意,这个应代词加加也很恐怖啊,不能乱加。
16:02
因为你加的时候有可能已经越界了。所以说这个时候呢,咱们要像这么去处理一下,就说你先判断这个index是不是已经到了。最后所以说应该怎么去处理,你先做一个判断。先判断判断这个index。Index。是否是否已经到表达式扫描到啊,已经扫描到。扫描到计算表达式,计算表达式的最后。对,那你怎怎么来判断已经到最后呢?非常的简单,非常简单。如果。如果你这个index最后那个还要处理啊,要这么去判断才行。加一。如果他加一。啊,如果他在加一已经到了这个,呃,到了这个等于这个认识了,等于这个我们这个表达式的长度。
17:07
就是它加一,就因为它它不停扫描嘛,扫描肯定这个,如果它加一等于这个,那说明他这个index已经在最后这一位了,而且已经处理过了。是这意思吧,哎,如果是这个条件满足的话,那说明已经到最后了,最有了,因为你加一已经到最,因为它整个长度是,呃,下标是从零开始算的。比如说你你现在是四啊,说明它已经到最后了,那四再加一等于五好满足,这就相当于说到最后了,那你就break,不要再玩了,否则。否则,Index。佳佳。In,加加,好,这个地方呢,就是要保证继续扫描。哎,保证你必须双标,然后这个处理完了过后呢,就是这个for循环处理完毕以后,其实就已经完成了前面的。六就是前面这个逻辑全部做完了。
18:01
就剩下最后一件事情了。如果扫描完毕,因为你复习完结束了,就扫描完毕,但是你这个预算并没有意味着全部结束,因为后面可能站里面还有很多数没有处理,现在呢,完成这个逻辑。好,完成这个逻辑呢,也是非常简单的一件事情,直接玩一下就行了啊,你看这个逻辑想想啊,同学们还是比较烧脑的,不循环。好,那你负循环的话,二话不说你开始弹嘛,但是你在弹的时候,你你先要判断现在这个符号站是不是已经空了,对不对,你退出的这个条件是符号占为空,所以说你先做一个判断,如果注意听。Op stack。Stack stack点它的这个top。等于负一。就说你的符号位的top一定等于负一,说明它已经空了,你不要再玩了,赶紧走。
19:02
赶紧走,这,这是退出条件。这个是退出条件。退出条件,如果说如果说他没有没有到这个地方呢,把这个逻辑重新走一遍。注意看啊,把这个逻辑走,但是走的时候呢,有一点点变化,有一点面包说数数里面弹一个弹一个符号,取出来取出来计算计算给我把数量压进去,但是这个没有了。就说你现在的符号站只有取没往里面压的过程了,就是取数站,取一个再取一个计算,计算完了把它,把它再重新压到数站里面去,最后同学们当他退出来的时候,如果你这儿没有任何毛病。这个站里面就留下了最后一个结果。最后如果啊,出来的时候,如果你代码没有任何问题。如果我们的算法算法没有问题问题,而且表达式也是正确的,表达式也是正确的,表达式也正确的,正确的则则结果就是哪个呢?Number stack里面的最后这个数。
20:14
他一定只剩最后一个数。没有别的原因,没有别的可能性,那现在那么呢,玩一把呗,那么我把这个结果弹出来。把这个结构弹出来,怎么弹number.pop。这一台数散就是应该就为空了啊,那我把它打印出来。Printf,好,我直接说表达式。把这个表达式输出来。表达式结果输出来。那么我们这个表达式其实就是EP,结果呢就是res。好,同学们,我保存保存一下。
21:00
好,先看语法有没有毛病啊,先看我们语法有没有毛,但泡泡呢,它也是一样的,也会有一个错误,所以说也要忽略掉一下。好。看一下代码有没有毛病,我们发现代码从目前来看没有毛病,但是能不能成功,现在我也得测一下啊,因为里面代码还是比较多,你看这有个for循环,For循环里面有if if里面有还有if else里面还套了一个if else,这个逻辑已经比较复杂了,比比较复杂了,OK啊OK,那么我们期望一次成功啊,我们期望一次成功。好的。我们勇敢的尝试一下。那现在首先我CD到上级目录,CD到刚才我们写的这个express DR。好,我勾让一下啊,如果有错我们再调一调。好,这个代码有问题,大家看这个结果是错的啊,三加二乘以六减去二等于2704显然是不正确的,我们来进行一个调试,看看哪里出了刚才的问题啊,同学们已经找到有一点东西了。
22:14
就是这个数。这门家是有问题的。我们这个时候应该干什么呢?我们应该把它这个CH。转成一个整数就完事了,对,问题出在这里的啊。还是非常不错的,同学们,我们来看看这地方的问题呢,我们已经找到了,那就解决一下,那就是在这个地方,我们不能把这个特们,因为你这个是相当于说你压了一个三,其实你本质压的是三对应的阿斯克玛及哪个值呢?我们先把原因说清楚啊,比如说是一个三,因为你这把三转成阿斯克玛,那也相当于是你加你这个压进去的是一个51。对。一加二四五十一,那显然这个结果是要出问题的。那这就是这个时候,这个不能压temp,而需要把我们的CH大家看到,这是为什么我一直没有把这个CH改掉,留在这的啊,所以说现在呢,我们要做一个动作啊,这个地方这是错的。
23:11
错误的好,那应该怎么修改呢?应该这样修改,同学们这样写,我做一个value。做一个value啊OK,那么value我做一个什么动作呢?是最。convert.par。然后我把这个CH转成一个整数,但是后面按64转,转完过后呢,我揭示一个value。没问题。接收一个value流,那接收到一个value过后呢,我首先把这个十寸convert把它引进去一个包包,哎,同学们说的非常到位啊,来现在呢,我把它放进去,放进去以后,放进去以后。放进去以后,放进去以后呢,这个地方应该好像也会返回一个L啊,这个我不做处理好,紧接着呢,再把这个压进去。
24:04
压进去好,压进去的时候呢,因为它这个是int类型,所以说你要把它转成int,因为你64转,因为你反复是64嘛,好这样就对了。好,把这个再来进行一个运算,同学们请看效果走。对出来你看没有三加二。乘以六减去二等于13正确,那么为了证证明它这个正确性呢?我们把这个值稍微的改变一下,同学们。啊,OK,那现在呢,我把这个改成三,OK,把这个改成四,我们看结果是不是还是正确的啊同学们,那我们先算一下三加。呃,三乘以六是呃,18加三二十一,21减去一个四等于17,看结果是否正确。看结果是不是17是正确的啊,同学们好,至少呢,我们这一步是正确的了,但是呢,老师要提出一个问题对吧,也就是我们在前面讲的时候呢,同学们也感觉到有一个问题存在,比如说我把这一帮改成一个30,那整个就错了。
25:10
这个就错了,为什么说这么说呢?因为你改成30的话,你在这个地方没有做任何处理,你是把一个直接当成一个数字零,没有做处理,这个时候我们看运算的结果是什么样子的,显然跟我们想的是绝对不一样啊,你看30加上三乘以六减去四等于14,显然是错的。好,那么下面呢,我们就准备来解决这个字符串拼接的问题。好,关于第一个解决的简单方案,我们先说到这儿。
我来说两句