00:00
同学们,我们来完成一个逆波兰计算器,所谓先说一下逆波兰计算器什么意思啊,那么逆波兰计算器呢?所谓逆波兰计算器就是说我们完成一个后缀,后缀表达式的计算器。那么我们要求的任务有这样几个任务,第一个输入一个逆波兰表达式,逆波兰表达式就是前面我们所说的什么呀,后缀表达式没问题吧。也就是说你你你用这个逆波兰计算器呢,要求你输入的本身就已经是个后缀表达式了。就不能输,输出中罪表达式明白,然后呢,我们这边用站来实现,这个时候站呢,我们就不用前面我们自己写的那个站了,我们用这个系统提供了站,大家还记不记得我们在前面讲站的时候讲这个,呃,讲这个链表的时候,我们是不是给大家测试了一个这样的结构叫star,这个就是个站,待会呢,我们就直接用这个站,就系统提供的站来完成,能理解啊,能理解OK,那么嗯,诶是这个第二个呢,我们要支持小小括号和多位数整数。
01:15
多位数的整数,因为我这里讲的主要是数据结构对吧,所以说对,因此计算器我又做了简化,我们只支持整数的计算,小数点呢,我不去处理了,因为我说了我这里讲的是数据结构,没有讲,呃,计算器本身如果你要加上小数点的处理也很简单,就是判断一下小数点就行了。下面呢,我们思路,呃和代码,我们走一下思路分析很简单,同学们还记不记得刚才我们再讲后缀表达式计算机求职的时候,其实这个就是它的一个思路。也就是说我们以这个后缀表达式已经把后缀表达式计算机求值的过程和思路已经分析到位了,那现在呢,我们就不多说废话了,我们直接来完成这个逆波兰计算器,OK,好,同学们,打开我们这一个,打开我们这一个,呃,Eclipse,我们编写这个逆波兰比老师来做一个。
02:18
好,那么我就这样写了,Poland Poland什么呢?Location location location就是呃,波兰的波兰的一个呃符号计数法,那现在呢,我们把这个勾上。Location啊,Locationation没问题,Locationation。Location,那现在呢,我们就直接给大家来演示了哈,首先呢,我们先先创建一个创建一个啊,先先定义一个,好吧,定义一个逆波波澜表。达式,那么逆波兰表达式呢,肯定是个字符串嘛,所以说我先写一个叫做。
03:03
后缀的一个expression。好吧,后缀的一个表达式,那后缀表达式我们用哪一个呢?好,我们先来定一下,也就是说。也就是说待会儿呢,我们就以这个案例来来讲解,好吧,这个逆波呢,表达是他。是不是就是这个,它对应的逆波兰表达式就应该是什么呢?应该是这个,是不是刚才我们已经已经分析过这个东西了。是他。那也就是说我们这个逆波的表达式呢,就应该是这样写的,我中间注意啊,中间我用空格隔开了。那有些人说老师你中间不用空格,有没有办法呢?一样的就可以进行一个过滤就行了,那现在呢,我们为了方便,我们数和符号之间用空格隔隔开,这是第一个啊,第二点我们说明一下,说明就是为了为了方便,为了方便,那么呃,这个逆波兰表达式呢,它的数字和符号。
04:04
中的这个数字数字。数诶这样啊,数字和符号使用空格隔开。当然,你要不隔开,后面我们再做处理就行了。好,这个拿到以后呢,下面呢,我们来把这个思路捋一捋,捋一捋,首先。我们在这个地方是不是老师讲到,老师讲到就说。我们在做这个这个过程,在做这个过程中呢,始终是有一个取值的过程。是吧,始终呢,我有一个取值的过程,就是我要泡呀,然后计算呢,那我的思路这样子我先干什么呢?我第一步注意听我的思路啊,我的思路第一步先将。先将这个S,也也就是这个串。我们说具体一点,把这个呢,先进先把它装入到放到哪里呢?放到一个list中。
05:08
大家明白我的意思吧,我先把它放在一个list。这个里面去放到这个r list里面,或者叫放到,放到那第二步我们干什么呢?就是。当我们有了这个a list过后呢,我们就想办法用这个a list跟这个站结合,把这个值求出来。然后干什么呢?将。哎,将什么呢?将这个2LIST。啊,干什么呢?传给一个方法。注意听啊。传递。传递给一个方法,这个方法里面呢,使用配合战。配合这个站。配合这个站完成计算,因为你这我们我们如果对这个字符串一个一个扫描太慢了,所以说我先把这个逆波兰表达式里面的这些个元素。
06:06
放先放到a list,然后我直接对a list遍利就可以了,就说原先是扫描一个字符串嘛,现在变成先把它放在一个a list中,然后把这个r list传给一个方法,然后呢配合站完成,怎么配合站呢?我们就直接遍历,以前是遍历,以前是扫描字符串,现在是遍历这个r list就可以了。明白我的意思吧,好,现在呢,我们先写第一个方法。先写哪个方法呢,就是将注意听这句话啊将。这个一个后缀,或者叫逆逆逆波兰表表达式干什么呢?诶一次啊一次。将数据和运算符干什么?放入到一个r list中。
07:02
那我写一个方法了啊,不多说了,Public static,然后呢,List里面放的就string,我不管你是数字还是运算符,我通通的当成字符串处理。这样就比较简单,我们写一个get list string,那这个时候呢,你给我传进来一个字符串,这个字符串就是一个S。好,我把这个全屏一下,这样好看。那么我怎么去处理它呢?因为你传进的是这个串嘛,所以说我先第一句话,先进行一个分割,将这一个S分割。这个前面我们是不是已经讲过,呃,老师都讲过这个东西啊,那现在我们就这这样分割S。SS。怎么分割呢?Split按照什么来分割,空格来分割,这个大家能看懂吧,然后呢,它返回是一个。
08:01
使宿主。实数组好,有个实菌数组过后呢,我们再创建一个list,对不对?List那就new一个rra list里面放的就是实菌。这个大家看能不能理解,然后呢,我把这个包引进去。对吧,把这个包引进去。好呃,那么这个时候有了过后呢,我就便利,诶这边还有一个忘了引了,忘了引了,那引进去过后呢,下面我们要做一个动作,就是for循环。我对谁循环呢?我对这面是不是元素对我们split进行一个负循环增强。是不是它每循环一次就取出这个字符串里面的一个元素,因为你这已经分割了嘛,它已经成为一个数组了,好了我就往里面放吧,List点。ADD跟着我的思路啊,那么把element放进去。那大家想一想,这个一个一个element是什么呢?就是实际上就是三四加号对不对,整个做完以后,我们将这个历史的返回。
09:08
代码就写完了,那我们我们先试一下这个方法到底做了哪些工作,好吧,我们先写一个,那现在呢,我先接收一把list string。好,拿到一个后缀的一个list,后缀表达式的一个list,然后呢,我们直接get这个东西,把谁放进去,把它放进去。同学们看一下,先先看看我们这一个list到底是个什么东西,加一下啊,RPN。那么我们运行一下,同学们一看就明白了,哦,原来是这个,看到没有,是不是按顺序拿到了,就是三四加五乘六减,就相当于把这里面的东西呢,分割出来放在一个。List里面,那我为什么要放到list里面呢?因为这样我我在取的时候比较好取吗?不然的话,你如果你不这样做的话,你还得设置一个index,所以一个一个的去扫,太累了,明白我的意思吧,好,下面有了这个东西过后呢,我们就可以按照刚才老师讲的这一套流程来玩了。
10:15
我把这个拿过来。好,现在呢,计算就可以完成,完成对逆波兰,逆波兰表。表达式的一个运算。运算好,那么它的步骤,它的具体步骤是不是这我已然分析过了,第一步,第二步该怎么扫描,那这个时候扫描呢,其实已经变成了对我们list的,诶对这个list的一个便利是是这个意思吧,同学们。诶,我把这个捋一捋好,有了这个东西,下面我们自己写代码,Public public。Static是不是它运算完了之后会返回一个int,因为我现在呃都是整数嘛,那现在呢,我就写个开了计算,开了K计算,那现在呢,我接收你给我传一个list过来,也就说你这拿到的这个list你给我传过来就行了。
11:15
那我拿到一个list。啊,叫LS。LS,那拿到以后我怎么来计算呢?首先我先创建一个站,大家记不记得,因为你这整个要往站里面放,说说我们创建一个站,这个时候只需要一个站就行了,注意啊,只需只需要。一个赞即可,所以说这个时候用后缀表达式来进行运算呢,其实它简单,那我怎么做呢,来十六一个啊,六一个大里面放的就是字符串。没问题吧?好,我得到这个赞了。那得到这个赞呢,我们需要引一下包包,引一下包包,好引进去,引进去过后,下面我们要便利谁,我们要便利我们的这个list。
12:04
是不是有点类似于我们原先写的用index扫描那个感觉对吧,那我就for循环增强了,For循环增强那么没取出来是不是一个string,或者是要叫做item也行,就一个个的元素嘛,就是三啊四啊这些都可以啊LS。是这意思吧?好,那那刚才我们讲了从左至右,那么如果发现是数,我们就压入对上,那现在怎么样判断是个数呢?我们这里使用一个正则表达式来取出数,同学们,正则表达式大家学过没有?如果没有学过啊,也没有关系,其实很简单,自己去看一下就行了,我这里呢,因为不讲政治表达式,我就不说了,我就直接写写代码了,If,如果我们取出来这个这个item。Item点什么呢?Match,它匹配,匹配谁呢?OK,它匹配。
13:05
多位数大家看我这边这个加加代表一到多,我就不讲了啊,这个就代表匹配多位数我写到这。匹配的是多位数,OK,那么如果我发现这个item是一个数,我怎么办呢?好,直接入账。入战,入战的话,其实就是刚才我们的sta。点push,谁就是这个item。对不对,把它放进去就可以了。简单吧,那如果说它不是一个,如果它不是一个数,呃,那就是运算符了,如果它是一个运算符,我们该怎么办?是不是从这个站里面弹出两个数运算再重新入账,是不是这个逻辑?是不是好,那就是如果不是呢,就是从弹出取,就是说pop出pop出两个。两个泡泡出。
14:03
两个数并运算运算,那么运算这个符号呢?呃,就是当前你扫描的这个it是吧?并运算再入账。明白意思吧,刚才是不是说这样再入站,那代码就简单了,我们自己写啊,Int b或者叫NUMBER2。Number我现在为了好写呢,因为我们是后面这个数减前面这个数,所以说我先拿一个NUMBER2,这样子呢,这样子呃,待会写的时候就统一起来了,怎么写呢,好S点。点pop,但是pop出来它是不是一个字符串呢?因此你要把字符串转成一个int啊,转成一个整数,是不是要用前面这个方法了,转一下就行了。这是弹出来第一个数,Number number1。Or in?In。好,弹出两个数,那这个时候仍然是。
15:02
大,这写错了啊,Sta颠泡泡。Pop。没有问题吧,比如说现在呢,我弹弹两个数好弹出来两个数过后呢,我们开始运算,运算的时候我们还需要去判断当前这个到底是一个什么符号,所以说我先定一个结果,这个是存放结果的,那开始做了做了啊,如果我当前。从历史里面取出来的这个符号,它是等于一个加。我这里就没有用Switch了,我用一个if else来做也是一样的哈,如果当前取出来这个it这个符号是个加号怎么办?是不是把这个NUMBER1加上NUMBER2就可以了。是不是很简单,然后else else if,那如果你取出来这一个元素,它是什么呢?OK,它是1A就写错了啊点。
16:04
点equals。它它是一个减法减号,它是一个减号,Result应该等于什么?NUMBER1减NUMBER2,注意啊,同学们注意一个地方,因为我先弹出来的数呢,我用NUMBER2来接收的,后弹出来数是用number一来接收的,所以说。哎,所以说我这写的是NUMBER1减NUMBER2没问题啊,如果你先谈到你用NUMBER1接收的,后台的用NUMBER2接收的,那你这个顺序要反过来写。这点大家能理解吧,刚才是不是已经分析过这个词了啊,那么else再来if,再来if,如果im.equals它是等于一个什么呢?乘法。好,乘法呢,我们把这个结果进行一个运算,就是NUMBER1乘以。乘以NUMBER2,是不是还有一个最后呢,就是如果它是一个除法。
17:01
对不对,Item啊,最后我们再最后再整理这个啊,再格式化啊item.equals如果它是一个除法,除法其实也要注意顺序。应该是后面这个数除以,呃,除前面那个数啊,那这个是二,一等于什么呢?NUMBER1除以NUMBER2。还是跟这个取出来顺序有关系啊,跟这个有关系,我把这个格式化一下。啊,格式化一下。老将好看。没有问题吧,那当然有一个可能性,就是如果加减乘除都不是怎么办呢?你给他报一个错好吧,你给他抛出一个异常就行了,说你这又不是加法减法,那怎么办呢?好,我就没有什么结果返回是不是我就直接抛出去一个,抛出去一个异常,同时啊肉。输入又一个run time exception。对吧,我们就说这个符号有问题,运算符有误,有误没问题吧,好,最后不管处理完毕还是没有处理完毕,最后我们应该干什么。
18:10
把就是你这做完你这整个这个for循环。这个IFS做完了以后,这个地方你拿到了,你拿到这个结果是不是要入站啊,要把把什么呢,把这个res入站。是不是刚才也是上分析的呀,那就sta。点push。Push,那push什么呢?Push这个res,但这个res呢,它是,呃,它原先我们定的这个sta是纯字符串的,你这是个整数,是不是要转一下,怎么转,很简单,这就可以了。这样大家能理解吧,就是把这个简单的一个把整数转成一个字符串的操作比较简单,那么如果写的更好一点呢,可以把这个空串写到前面去,这样更明显哈样更明显好的,呃,这个做完以后for循环整个运算,运算完毕过后同学们是不是。
19:11
最后留在树里边的,留在这个站里面的,它应该是什么呢?应该就是这个结果了。是不是就最后注意听啊,最后留在留在这个大。中的这个数据是什么呢?就是运算结果。那么运算结果你可以怎么办呢?Return回去就行了。怎么。呃,因为我返回的是一个整数,所以说我们这样来做啊,那就这样一个呃,S点呃,Sta。点我们的pop泡,但是pop出来它是一个字符串,这是个整数,怎么办呢?转一下就行了,把字符串转成一个整数,就in t。in.pass。是不是这样就可以了?
20:00
同学们,是不是这个意思?就是相当于说我我在这个地方把占最后这个数弹出来,取出来转成一个整数再返回。那也就是说这个时候呢,就把我们这个结果做完了,也就说按照这个就全部做完,做完我们来测试一下对不对吧,对不对,好了,来看一下结果。好,我就这样子玩一把啊,我把这个拿到,Re,等于什么呢?我们这有calculator。把我们这个ipn list。就是我们存的这个list放进去好放进去那呃RPN呢,如果大家不习惯啊,你就叫叫list也行啊,就叫list也行,我这改一下就行,好吧,这个也没问题,也没问题,好,那现在这个结果拿到以后。把这个结果拿到以后呢,我们把这个结果输出来,看看结果是什么,好吧,把这个结果拿出来,我们看一下这个结果是什么,就说计算的结果。
21:00
结果是我们把它输出来吧。等于。加上res。就可以了。RS就可以了。对不对,那如果有异常的话呢,它会跑异常,那么我们现在先人为的算一下同学们。三加四乘以乘以五减六,这个结果呢?如果我们自己算是七乘以五等于35,呃,35减去一个六,应该等于29。没问题吧,好,我们运算一下。我们发现呢,诶,我们发现这个结果呢,有问题,我们看哪里有问题啊,看这69。好,他说这个地方有一个错误,有一个错误,他说有一个符号不是,那么我们来看看哪里有问题,我们来看一下是不是这有个空格的问题啊。是不是我们在给的时候多给了一个空格,把这个空格去掉就可以了,那我们再来运算一把,好,我们再来运算一把,走一个。
22:08
好,还有问题,我们再来看看哪里有问题,我们再调一调啊调一调。呃,代码我们来简单的走一走,看哪里有问题啊各位。呃,同学们看看我们哪个地方有问题呢?你们有没有发现我这写的是三加四乘以五,但是我在这个地方判断是用。是不是,那说明如果我要,嗯,我要按这个写的话,那我这传的应该是什么样。是这个才行。是不是这个道理?同学们好,我们再来运算一下。好,这个结果呢,29就是正确的这个。
我来说两句