20175307高士淳2019-2020-2 《Python程序设计》实验二报告
课程:《Python程序设计》
班级:1753
姓名:高士淳
学号:20175307
实验教师:王志强
实验日期:2020年4月11日
必修/选修: 公选课
一.实验内容
1.设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。
2.考核基本语法、判定语句、循环语句、逻辑运算等知识点
二. 实验过程及结果
在我刚看见这道题的时候,我最先想到的是eval()函数,该函数可以执行一个字符串表达式,并返回表达式的值。但是当我重新审视这次的实验时,我觉得这可能不是实验的目的。然后我想到的是数据结构和java课上学的出入栈操作,或者是中缀表达式转为后缀表达式。
后缀表达式求值比较简单,基本过程为:遇到数字则进栈,遇到运算符则出栈俩数字然后计算结果,再把结果入栈,过程比较简单。一般我们输入的计算公式都是中缀表达式,不能直接用后缀表达式进行计算,需要先将中缀表达式转为后缀表达式,但是中缀转后缀比较麻烦,所以利用两个栈直接求值,一个栈保存数字,一个栈保存操作符。
定义两个栈,stack1存储数字,stack2存储运算符,将字符串str元素一个个扫描,遇到数字型则进栈stack1,遇到运算符型,则要看看栈stack2栈顶元素运算符优先级是否比自己大或等于,如果真比自己大,那么那个运算符出栈,假设出栈是运算符a,那么此时从stack1中出栈两个数字b、c参与运算,把运算结果进栈stack1,此时此字符还不能进栈,如果栈顶优先级还比自己大或等于,那么那个栈顶运算符还要拿出来运算,直到有小于自己的自己才进栈;遇到‘(’直接进stack2,遇到’)’,则就要把这一对括号之间运算符都一个个拿出来运算,当str[i]读到’ ’那么扫描结束,结束后还要注意stack2里应该还有一个运算符,于是还要多加一步运算,最终stack1中剩一个数,那就是最后结果
三. 实验过程中遇到的问题和解决过程
1.字符串读取的时候,没有考虑两位数。
解决方法,在读取到数字的时候,用while语句对后面的字符进行判断,如果为数字则继续判断,直到出现操作符,并将字符串数字转为数字。
while i + 1 < len(s) and s[i + 1].isdigit():
i += 1
data.append(int(s[start: i + 1])) # i为最后一个数字字符的位置