算术表达式--数据结构实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

哈尔滨工业大学计算机科学与技术学院

实验报告

课程名称:数据结构与算法

课程类型:必修

实验项目名称:线性表及应用

实验题目:表达式中缀转后缀并求值

班级:0903301

学号:1090330117

姓名:李清

设计成绩报告成绩指导老师一、实验目的

掌握线性表的使用,能用栈将中缀表达式转换成后缀表达式并求值。

二、实验要求及实验环境

实验要求:1、使用栈来进行操作

2、能输出后缀表达式

3、正确求出表达式的值并输出该值

实验环境:NetBeans IDE 6.7.1 / win 7系统

三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系,自己扩展内容的等)文档收集自网络,仅用于个人学习

主要数据类型:

queue A 存储原来算术表达式

stack B 存储转换成的后缀表达式 stack B1 临时存储后缀表达式(B )

stack C

表达式转化过程使用的过度栈,存储操作

stack S 存储数字(包括输入和计算过程中的数)

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 &A, stack &B) //将中缀表达式转换成后缀表达式文档收集自网络,仅用于个人学习

{

stack C; //表达式转化过程使用的过度栈

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倒序

相关文档
最新文档