算术表达式--数据结构实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
哈尔滨工业大学计算机科学与技术学院
实验报告
课程名称:数据结构与算法
课程类型:必修
实验项目名称:线性表及应用
实验题目:表达式中缀转后缀并求值
班级:0903301
学号:1090330117
姓名:李清
设计成绩报告成绩指导老师一、实验目的
掌握线性表的使用,能用栈将中缀表达式转换成后缀表达式并求值。
二、实验要求及实验环境
实验要求:1、使用栈来进行操作
2、能输出后缀表达式
3、正确求出表达式的值并输出该值
实验环境:NetBeans IDE 6.7.1 / win 7系统
三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系,自己扩展内容的等)文档收集自网络,仅用于个人学习
主要数据类型:
queue
stack
stack
表达式转化过程使用的过度栈,存储操作
符
stack
char ch ,QQ
int d1,d2,d3 主程序流程图:
文
档收集自网络,仅用于个人学习
输入中缀表
将中缀表达式转换成后缀表达式
Transition 函数
后缀表达式求值
Value 函数
结束
输出表达式的值
输出后缀表达式
开始
Transition 函数流程图:
文档收集自网络,仅用于个人学习
Value 函数的流程图:
乘除号
把上一个左括号之前的所有操作符弹出存入B 中,再把+,-存入C 中
弹出前面紧邻的*、/,再把这个*或/存入C 中
数字
存入B 栈中,用空格表示一个数值的结束
判断
A 不空
A 空
将C 栈中所有运算符依次弹出存入B 栈中
队列A.front
判断
左括号
右括号
加减号
存入C 栈中
把上一个左括号之前的所有操作符弹出存入B 中,再弹出左括号
文档收集自网络,仅用于个人学习
注:在value 函数中还可以判定除数是否为0,为0则输出"0 can't
be a divisor!",并终止程序。文档收集自网络,仅用于个人学习
四、测试结果
B 弹栈
判断
数字字符
运算符
求出其数值并存入S 栈中
从S 栈中取出栈顶的两个数,进行相应的运算,并把结果存入S 中
B 空
返回S 的栈顶元素
判断
B 不空
由测试结果可知,基本完成了实验要求。
五、系统不足与经验体会
1、该程序只能运算整数,也不能处理输入的负数
2、不能处理非法输入
3、几种线性表(队列、栈、数组、链表)从根本上说可以实现同一个功能,只是难易程度的问题,熟悉各线性表的特点有助于快速选择简单的方法。文档收集自网络,仅用于个人学习
4、第一次实验,代码比较乱,可能有些重复的地方
六、附录:源代码(带注释)
#include
#include
#include
#include
using namespace std;
void transition(queue
{
stack
char ch;
while(!A.empty())
{
ch = A.front(); A.pop();
if(ch >= '0' && ch <= '9') //判断数字
{
B.push(ch); //压栈
while(!A.empty() && A.front() >= '0' && A.front() <= '9')文档收集自网络,仅用于个人学习
{
B.push(A.front()); //其它位依次入栈至该数字结束
A.pop();
}
B.push(' '); //用空格表示一个数字的结束
}
else if(ch == '(') C.push(ch) ;//判断为左括号
else if(ch == ')') //判断为右括号,把上一个左括号之前的所有操作符弹出存入B中,再弹出左括号文档收集自网络,仅用于个人学习
{
while (C.top() != '(')
{
B.push(
C.top());
C.pop();
}
C.pop();
}
else if(ch == '+' || ch == '-')//判断为加减号,把上一个左括号之前的所有操作符弹出存入B中,再把+,-存入C中文档收集自网络,仅用于个人学习
{
while(!C.empty() && C.top() != '(')
{
B.push(
C.top());
C.pop();
}
C.push(ch);
}
else if (ch == '*' || ch == '/') //判断为乘除号,弹出前面紧邻的*,/,再把这个*或/存入C中文档收集自网络,仅用于个人学习
{
while(C.top() == '*' || C.top() == '/')
{
B.push(
C.top());
C.pop();
}
C.push(ch);
}
}
while (!C.empty())//将C栈中所有运算符依次弹出存入B栈中
{
B.push(
C.top());
C.pop();
}
//下面是将B倒序