00:00
好,同学们,算法已经有了,那下面呢,自然到了我们这个代码的实现,我们就根据刚才老师的整个这个分析的流程,用代码把它走一遍啊,看看这个怎么写。看看这个怎么写来吧,打开我们的Vs code,对,那么我们写一个新的文件夹。这个呢,我们就叫express啊这个。计算表达式啊。计算站。那么现在呢?我写一个文件叫main.go。好,新建package主包import。那么这里面呢,我们有一个form。Form,好,现在呢,写一个组的函数。那么赞呢?我就不想再重新去写一遍了,我就用刚才我们写好的这个赞,直接拿来为我所用,刚才我们写了一个赞。
01:01
Sta在下边儿找一找啊。往上走。应该在这个位置好,我把这个写好的站呢,直接拿来为我所用,从这开始。好,我把它保存到这里。直接截到这边来,这是我的一个站。那么这个站呢,呃,因为我们表达式可能将来会比较大一点,所以说这个站呢,我们可以把它扩大一点,比如说20。20好,那呃,这边我们把该引入的包包引进去一下as。好,这个也有了,好这个站相当于说它的push,它的pop,它的这个显示我们都有了。那现在呢,就根据刚才老师的思路,一步一步实现啊,跟上老师思路首先。我们先来搞两个站,一个是number sta,一个是sta对。
02:02
那么现在我们开始写一个速战。数站,还有一个符号站。符号站好来,走一个number sta。等于at符号什么呀,Stack stack。呃,那么我们把这个初始化一下,呃,首先它的maop等于20。对,我们速战呢,最多放20个数,那已经很多了啊,已经很多了,那相当于你这个表达是可以很长了,已经,那么就给他一个20吧,然后呢,Top。呃,初始值为负一,这个就写完了。它的数组大小呢,就是20,就是20不动它,我们就做这个整数的运算啊,那就是老师,如果小数呢,小数你这改成float就行了,我这就不去动它。啊,然后呢,呃,还有一个符号站。
03:01
还有一个符号站也把它搞出来。符号站,符号站呢,我们取个名字叫oper。Sta没问题,这两个呢就写好了,写好过后同学们可以看到啊,下一步下一步我们要去做一个索引,这个索引的价值是在于它可以帮我们去扫描表达式对不对,好,所以说呢,我先把表达式写出来。我们就写这个比较简单的表达式,待会儿我们再说,呃,如果多了的话,会不会有问题啊,有有多的情况下我们再考虑一下,好,现在打开这个表达式,就是我们写的三加二。乘以六减去二。好把它放在这里,好,这个这个就是个字符串啊,就是字符串,如果是不是字符串,咱们直接就可以算了,对不对,好写完,那现在呢,定义一个索引。发酵定义。
04:01
定义一个index,帮助我们扫描。它的作用是帮助扫描,扫描什么呢?表达式好,初始化为多少呢?为零,就从零开始扫描。好的,从零开始扫描。啊,那么在扫描的时候,咱们怎么去扫呢。对,咱们怎么去扫呢?显然就是一个一个的去,没有别的办法,只有一位一位的去,你不能两位同时扫,对吧,所以说这个地方我们先来做一个for循环。因为你在扫描的时候,你是循环扫的,你不可能说扫一次就完事了,对吧,所以说呢,有有一个这个这个index,那么就开始扫第一个。CH。笨鱼。等于什么呢?怎么去扫描这个字符串呢?同学们大家都知道字符串的本质,它也是一个切片的,到底层也是用切片可以来操作的,因此呢,我这么取,大家看能不能看懂。
05:09
OK。好的,大家看这句话,这句话,这句话的意思就是取出,从这个express里面取出就是index的一个,如果你index加加,就取出第二个,以此类推,但是它返回的是个字符串,是单个字符的字符串,你比如说比如说你你扫描这个地方,它返回的就是三,但是呢,它返回的是这个三。对。好,那你现在要根据刚才这个逻辑了,就来判断它是什么玩意儿了,问题来了。这一系列东西,东西就摆在我面前了,什么呢?怎么去判断它是一个数字?怎么去判断它是根运算符?麻烦。你怎么知道它是一个运算符,是个数字呢?那你想,显然你要写一个专用的方法来处理了。
06:01
所以他这个逻辑,这个思维,你要是自己能直接写出来,对你思维锻炼是很有帮助的啊,那显然如果是我来设计的话呢,我一定会写一个专门的方法来判断它是不是一个运算符,如果它不是运算符,我们认为就是数字就完了。对,还有这个计算也是一样的,那么现在老师开始写一个写一个东西啊来,现在我们给这个站增加几个方法。第一个我们要给这个站增加一个判断一个字符是不是一个运算符的问题。啊,判断。判断一个一个字符,字符是不是一个什么呀,判断一个字符是不是一个运算符。运运算法,那么我们这里面呢,只做加减乘除取模呀,那些我们想着别别去玩了,那个就很复杂,那么我们就做加减乘和除。
07:05
那么同学们都很清楚的知道,单个的字符在本质上其实就是一个整数,它是一个bit,因此呢,我这就偷了一个懒啊,我偷一个什么懒呢?我就直接用这个它对应的阿斯克玛来判断它是不是一个整数,这就很巧妙的利用这个特性。因为大家都知道,我们以前讲过加法、减法、乘法和除法,它们对应一个阿斯克玛,那么阿斯克玛呢,其实它的本质就是一个整数,所以说我就利用这一点。我就利用这一点,不然的话你去看别的,比如你看一个Java写的数据结构,跟我时间就不太一样。啊,因为我们这个东西这个还有语言的特征,语言特性在里边,你你不搞的话,你也搞不定他。好,所以说老师就这样写了啊,就怎么写呢,我这样写大家看能不能看懂范可。这时。Stuck,然后我们这边写一个叫做is。
08:05
Is oper,那这个iser呢,我们就这样写给他,给他给我传一个这个这个这个直进来,比如说value啊,是个int啊int,因为待会呢,我我把这个截截过来,这个我要肯定要转成个int给他,那么同学们来看一下,呃,什么时候是运算符呢?好我们做一个判断。如果这个value等于。哇,我们要查一下阿斯克玛了。注意啊,同学们,我们来查一下阿斯克玛这个表,你先不要着急,因为这段代码呢,确实要小心一点,写错了,调试起来难度很大,就写出你你自己调错,你都不知道怎么去调。啊,大家可以看到,在我们阿斯柯玛里面呢,它有这么一个关系,它的加这个符号是43乘是42。它的这个减是45,它的这个除是47,注意这方特别诡异。
09:04
以前我写我自己写完了,过后我整了半天,我说这个结果老是错的呢。我发现这个地方错在这儿。他这个阿嘛,特别讨厌,一般我们中国人说加减乘除,一般中国人是这样写的吧,那我们也很少别的顺序,就加减乘除嘛,结果它是乘加减除。以下顺序变变了,第二点,大家注意到它的这个阿斯克玛不是连在一起的,一般来说加减乘数连在一起嘛,它四十二四三跳过了一个逗号。然后又跳过一个点号才是这个层,所以你这么要是不注意的话啊,你会发现。你怎么整都怎么做,有些东西一上来就是,诶很自然,42 43 44,然后一个45,最后结果死活。死活都是错的,结果就在这儿犯了一个巨大的错误啊,不小心,因为我们人都有惯性思维嘛,大家都会认为加减乘除,而且一般都会认为它连在一起的结果全全不对的,所以注意这个细节啊,大家注意一下,42 43。
10:08
45和47,好,我把它写好啊,那就写了42。摩啊,或者呃,Value等于43,或者value等于45,或者value等于47,好,在这样一个情况下,我们认为它是一个操作符对吧?所以返回一个处else。是。好,如果它不是这几个符号,呃,也也说它不是这几个值的话呢,我们就给它返回一个false。AL。好啊,那么当然地方应该有一个返回值,叫布尔值。好,这个呢,就是我们说的这个东西了啊,就是判断它是个操作符,那么还有一个问题,还有一个问题就是大家可以看到,因为待会儿呢,我们还需要一个方法。
11:07
什么方法呢?就是计算,大家看我这反复说运算后,运算后,那么这个运算后呢,我们肯定最好也写一个方法比较好。你别你别到时间就说,哎,就是就是每一个就是自己在那加血,这肯定不行,所以说运算这个地方呢,我们也要做一个方法,另外还有一点,大家看到这里面有个很恐怖的东西,叫优先级大于。那就意味着你还得有一个方法是专门来判断谁的优先级高,谁的优先级低的问题。所以这边还是有点麻烦的哦,那那有的人说老师那怎么办呢,写方法呗。那么我这个运算我相信同学们比较好搞定,那我就先写这个运算了啊,来我们做一个运算的方法。运算的。运算的运算的方法来写一把,Fun this share sta,我们就叫开了吧,开了开alcul就是计算的意思,那么你注意同学们注意啊,你给我传两个数进来,再给我传一个运算符就可以了,能理解意思吧,那么首先一个NUMBER1,那么我们这都是int number21个传进来当呢,还要给我传一个offer。
12:22
Op假设是运算符了,它也是用int来替代,因为我们都用加减,加减乘除嘛,它有数字,好,现在呢,整个会返回一个结果。我们都是int来算的,那就用一个很很简很简单的方式,什么呢?SWITCH1句。SW Switch,谁呢?好,来做一个判断,K,如果它等于42。各位同学,42我们知道它是一个乘法。42是乘法,那么乘法呢,顺序其实是无所谓的,所以说这个地方呢,你可以写NUMBER1乘以number,但是最好不要那么写,还是按顺序来,是把是把NUMBER2写前面去比较安全啊。
13:10
虽然你这样写两个相乘吧,这个无所谓,但是呢,咱们还是按规矩来,因为我们的算式先入后出来的,所以说这样子调整一下好,紧接着K43,呃,如果你这个运算符是43。哎,各位同学,如果它是43,那么43是什么呢?大家看一下,43它是一个加法运算,它是一个加法运算,所以说R就等于NUMBER2加上一个NUMBER1没问题。好,紧接着再来判断,然后呢,K如果是45,各位45的话呢,我们来看一下45它是一个减法,好减法的顺序一定是NUMBER2减NUMBER1,否则这个结果是对错的啊,等于NUMBER2减去一个NUMBER1没问题。
14:01
那么还有一个就是除法case是47,如果它是一个47没问题,那么result就应该等于NUMBER2除以NUMBER1。好,这样子就讲最后如果还有别的错误呢?呃,如果还有别的那就错了,我们写个呃,NUMBER1非常好,NUMBER1好,如果说你这个不小心给了一个错误的,那么我给大家提示一下default,就是你的这个运算符有问题错误。对,就直接提示运算符。运算符错误。OK,运算不错误。好,那这个最后处理完了以后呢,不要忘了一件事情,瑞return我们RS就完事了。好,一一个地方都不要错啊。最后再看一下42 43 45 47没问题,没问题,那么我这里运算的方法写完了,我还缺少一个特别重要的方法,就是优先级,这个地方就需要同学们动脑筋了。
15:06
你说这个优先级谁高谁低呢?没办法判断,因为你不知道现在你传的是加法还是减法还是除法,乘乘法没办法,你只有一个办法,就是你给我一个操作符,我给你返回它的优先级。大家明白底层都这么干的啊,就你今天学完了后,你至少知道我们第一期在底层怎么去加减乘除的,其实还是很有档次的,就说那么我们可以定,我们认为乘法和除法它的优先级为一。那个一,然后呢,那个什么呢?加法和减法为零就可以了,我认为乘法和除法它的优先级高一点,如果你将来在这个扩展上,你说诶老师小括号的优先级更高,那你就把小括号的优先级定为二。它底层也是这么来做的,那么我这里优先级,因为我的预算比较少嘛,就一个加减乘除,所以说我这样定义一下啊,来第一个优先级。
16:05
我们编写一个方法,方法返回某个运算。运算符的优先级。优先级,注意这个优先级是我们定的,是程序员定的啊,是程序员定的,比如他这个是很具有灵活性的程序员定的,没有一个固定的这个说法,比如说我们我们认为我我现在这样定,就韩老师样定,我认为乘法和除法优先级为一,我认为加法。和减法。加法还有减法,它的优先级为零,假设我就认定,我只要保证。这个乘法和除法优先级高于它就可以了,那这个也很简单,咱们直接写一个函数,This share stock。大,然后呢,我就写个优先级,优先级名词叫呃,Priority priority好像是这样写的啊,Priority。
17:07
这优先级这个单词呢,用的不太多,Priority好,然后呢,你给我一个操作符就可以了,也是一个特类型的,我给你返回一个优先级也是特类型,那么我做一个判断,如果你这个操作符等于乘乘是42或者。Oper。它等于一个除,除我们看是多少除法除这个符号呢,是47,好,如果它等于47没问题,那么我就返回它的优先级为一。我1L1。A241A21,如果它的这个操作符啊,你给我传的是一个43或者是45,那么我认为它呢,就是加或者是减,大家看43是加,45是减,确定一下。
18:00
43。确实是加去45是减号,在这样一个情况下呢,我们认为它的优先级为零。就写完了,那最后最后一个呢,就是else啊,Else呢,我们就认为有有错误对吧,有else我就不去处理了啊,那这样子我就这样做。啊,我这样确定一下这样做啊,默认给他来一个零,然后呢,我就不在这儿返回了,我就直接在这赋值。啊,给他一个优先级为一,这个给他一个优先级为零。最后返回,因为我这儿还有一个其他情况,其他情况我现在没有处理,比如说你将来还想设置一些小括号,大括号,中括号,你可以在这个基础上再再再增加,好写完了。优先级就写完了。好嗯,那现在呢,这样子啊,同学们,因为下面还要写,我我估计啊,就是一边讲一边写,估计还要有点时间,我们第一部分代码先给大家写到这里。
我来说两句