一.实验题目
四则运算
二.实验内容(请详细描述你是如何设计和实现的)
分成两部分:
第一部分:生成四则运算式子
使用堆栈,然后按照数字,符号这样的顺序压栈,数字通过 random 函数随机生成 100 内的,符号则调用符号生成函数。如下图
符号生成函数如下,用 0 代表加号。1 代表减号,2 代表乘号,3 代表除号,然后根据随机数来选择将哪个符号传回去。

通过这两步我们生成了一个不带括号的四则运算式子,然后也是可以通过控制参数来选择生成式子的位数和数量的,还有加减乘除的添加与否。接下来则是需要一个生成括号的操作,首先我, 先随机选择是否生成一个前半边的括号,这个括号的位置不能出现在最后一位数字的前面,不然就没有意义了,所以需要用 a(式子的数字数量)-f(随机生成的括号的位置)>2 来确保括号至少会包括两个数字,再之后,则是随机选择这个括号要包含多少位数字,这将决定后半边括号的位置,所以随机数得 a-f 里面随机,否则则会超出长度。
第二部分:对式子进行运算
这部分我则是学习并参考了网络上的逆波兰表示法
也即后缀表达式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。既然没了运算符的优先规则,那么计算机解析起来自然容易的多。
对于我们常见的表达式,称为中缀表达式,每个中缀表达式都有对应的后缀表达式。
在解析后缀表达式时,只需要遵守以下原则即可:从左往右遍历
遇到数字直接放入容器
遇到运算符,将最后两个数字取出,进行该运算,将结果再放入容器遍历结束后,容器中的数字即为运算结果
按这个过程走下来,自然而然的想到用栈是最合适的。
现只需想办法由输入的中缀表达式转为后缀表达式即可完成解析。
2、由中缀表达式得到后缀表达式的算法
由中缀表达式得到后缀表达式,只要遵守以下步骤即可:
首先设置运算符的优先级(这样设置也是为了简化程序):
”null” 栈顶若为空,假设优先级为 0
“(” 优先级设为 1
“+-” 优先级设为 2
“*/” 优先级设为 3
从左向右遍历中缀表达式
遇到数字直接输出遇到符号
遇到左括号,直接压栈
遇到右括号,弹栈输出直到弹出左括号(左括号不输出)
遇到运算符,比较栈顶符号,若该运算符优先级大于栈顶,直接压栈;若小于栈顶,弹栈输出直到大于栈顶,然后将改运算符压栈。
最后将符合栈弹栈并输出。
三.实验的结果展示


四.实验心得体会
没想到平常我们经常使用的四则运算式子想要在电脑上自动生成也是有如此难度的,在看到这题目的时候,我也是早早地确认了思路,就是用堆栈来存储式子,但许多小细节也是困扰了我许久,修修改改生成完了之后,发现想要在这基础上加个括号有些许困难,又转而将式子存进 string buffer 里,总算是可以添加了括号,但由于思路的问题,只能添加一对括号,还由于经常生成不符合要求的括号而被筛掉,导致括号生成率略低。而在解四则运算式子上,个人一开始想不出任何思路,而后在网上寻找借鉴了逆波兰表示法,看完后我大受震撼,原来式子还能这样解,于是我也照葫芦画瓢地写了一个。最后的 IO 流则是在大一那时候的 C++便掌握了的,这次也是直接搬过来就用了。写完也是感到我对 java 了解的还是太浅了,有许许多多的好用的算法和数据结构都没能用上,也没能发挥出 java 这门语言的优点,着实是,还有许久的路要走啊。
浙公网安备 33010602011771号