用栈和二叉树实现中缀表达式转后缀表达式构建计算机并求值实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
姓名:黄雄镖学号:13331093
院系专业:软件学院2013级教务4班
完成日期:2014 年10 月20 日
实验题目:实现一个较为通用的计算器
需求分析:
实现一个包含加减乘除运算的较为通用的计算器,操作数可能是负数,并且可能是多位数。运算式中可以有括号和多余空格。计算器对负号不敏感, 形如1+-1或者1+(-1)都是可以接受的。
概要设计
思路: 将表达式的中缀表达式转换成后缀表达式,然后利用一个栈或者建立二叉树对后缀表达式进行求值。
由于多位数在转为后缀表达式时会分不清, 故在每个数和运算符后面加上一个空格作为区别
在主程序中调用用栈求值的计算器类和用二叉树计算的计算器类, 输出算式的结果
13331093_03.h里存放用栈求值的计算器类
13331093_03_tree.h里存放用二叉树计算的计算器类
13331093_03.h的类里主要包括:
获得算术表达式的函数getexpression(string expression), expression为所要计算的算术表达式计算函数calculate(string num2, string num1, string op), 输入为两个数(字符串形式)和一个操作符, 返回值为计算结果(字符串形式)
返回中缀表达式函数ShowMiddleExpression(), 返回的中缀表达式为字符串形式
RidSpace(string origin)用于去除输入中多余的空格, 输入为要除去空格的算术表达式, 返回去掉空格的算术表达式
MidToLast(string str)中缀表达式转后缀表达式
获得后缀表达式函数GetLastExpression(), 返回的后缀表达式为字符串形式
用栈执行计算后缀表达式函数exe(), 返回计算结果为字符串形式
13331093_03_tree.h类里主要包括:
获得算术表达式的函数getexpression(string expression), expression为所要计算的算术表达式计算函数calculate(string num2, string num1, string op), 输入为两个数(字符串形式)和一个操作符, 返回值为计算结果(字符串形式)
返回中缀表达式函数ShowMiddleExpression(), 返回的中缀表达式为字符串形式
RidSpace(string origin)用于去除输入中多余的空格, 输入为要除去空格的算术表达式, 返回去掉空格的算术表达式
MidToLast(string str)中缀表达式转后缀表达式
获得后缀表达式函数GetLastExpression(), 返回的后缀表达式为字符串形式
生成一颗二叉树的函数makeTree(TNode *&p)
后序遍历二叉树并计算的函数PostOrder(TNode *p), 返回计算结果为字符串形式
a.调试过程遇到的问题与解决方案:
遇到的问题:调试过程中出现程序崩溃的现象, 后来debug发现是没有考虑到执行运算过程中出现的-()的情况
原因:没有考虑-()的情况, 导致栈为空的时候还弹出元素
解决方案:特殊处理这种情况
b.时间和空间复杂度:
除去输入中空格的操作的时间复杂度为O(n),中缀表达式转后缀表达式的时间复杂度为O(n), 用栈执行运算的时间复杂度为O(n),后序遍历二叉树的时间复杂度为O(n) 所以用栈计算或者用二叉树计算的操作的时间复杂度为都是O(n)
栈属于线性表, 故用栈计算的空间复杂度为O(n)
用二叉树计算的空间复杂度也是O(n)
主程序:输入一个整数m,代表有m个输入
接下来有m行,每一行输入你要计算的式子
13331093_03.h:含有用stack计算的计算器类
用法:
calculator c_stack 声明一个计算器对象
c_stack.getexpression(expression) 把算术表达式存入计算器中expression为所要计算的算术表达式
c_stack.GetLastExpression() 获取算术表达式的后缀表达式
c_stack.exe() 获取计算结果
13331093_03_tree.h:含有用二叉树计算的计算器类
用法:
calculator_tree c_tree 声明一个计算器对象
c_tree.getexpression(expression) 把算术表达式存入计算器中expression为所要计算的算术表达式
c_tree.GetLastExpression() 获取算术表达式的后缀表达式
c_tree.makeTree(tree) 建立一棵二叉树
c_tree.PostOrder(tree) 后序遍历二叉树并返回计算结果
测试结果
在主程序中调用用栈求值的计算器类和用二叉树计算的计算器类, 并对输入表达式进行两种方法所生成的后缀表达式和结果的对比测试代码在test.cpp中
测试输入:
11
-(12.34)
-1
1+-2
1+(-2)
11 + 23 * 32/4-8
-1.234/5 *(1 +3)
2.333*4-(3+(-5))
12345+5432.1/(-12345)
-(100 ) * 0.5 -(-22.22)
1234/-123+3.333
-( 123*50 ) / 2.2