数据结构实验报告 逆波兰表达式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HUNAN UNIVERSITY 课程实习报告
题目逆波兰表达式求值
学生姓名XX
学生学号
专业班级
指导老师
完成日期
一、需求分析
1.本程序要求对用户输入一个后缀表达式,打印输出其结果。
2.后缀表达式有用户通过键盘输入,其中两相邻操作数之间利用空格隔开,以“#”表达结束。如果该后缀表达式正确,那么在字符界面上输出其结果,计算结果小数点后面保留两位有效数字,如果不正确,请在字符界面上输出表达式错误提示。
3.测试数据
输入
2 3*1-#
输出
5
二、概要设计
1.抽象数据类型
为实现上述程序的功能,应以一个字符数组存储用户的输入,运算中运用到整数及浮点数。
2.算法的基本思想
根据题目要求,计算后缀表达式,需要用到堆栈来实现。算法如下:
1)假设此表达式正确从字符串第一个开始扫描,遇到运算数就先转化成为数值然后压入堆栈中,
2)如遇到运算符则弹出堆栈上面的两个元素,并进行对应的运算,将得到的值压入栈中,循环计算,然后往堆栈中压入结果,直到最后一个字符为止。
3)若表达式错误:返回错误提示。
ADT:
Stack{
操作对象:字符,整数,浮点数
基本操作:
Stack(int size);//构造大小为size的栈
~Stack();//释放内存空间
void push(const float& n);//数据进栈
float pop();//数据出栈
int length();//计算栈内元素个数
}
3.程序的流程
程序由三个模块组成:
1)输入模块:输入一个表达式的字符串。
2)计算模块:设计一个计算后缀表达式的函数。
3)输出模块:输出显示计算的结果。
三、详细设计
1.算法的具体设计
算法流程图如下:
2.算法的时间复杂度分析
该算法的时间复杂度O(n)。
四、代码源程序
#include
#include
#include
using namespace std;
class Stack{ 输入字符串a
a[i]>47&&a[i]<57?
数值进栈
a[i]=' '?
a[i]==42 ||a[i]==43 ||a[i]==45 ||a[i]==47
?
运算结果进栈
输出结果Y
N
a[i]='#' ?
Y
N
private:
int size;
int top;
float *listArray;
public:
Stack(int size=5){//定义构造函数
this->size=size;
top=0;
listArray=new float[size];
}
~Stack(){
delete [] listArray;
}
void push(const float& n){// 入栈
if(top==size)
return ;
listArray[top++]=n;
}
float pop(){// 出栈
if(top==0)
return 0;
else
return listArray[--top];
}
int length(){// 栈内元素个数
return top;
}
};
void nibolan(char *p){
int a=strlen(p);//字符串长度
int t=1,k=0,g=0;//s作为有数的标志,t作为是否为整数的标志,k是记录小数计算的幂级数float in=0,fl=0,x,y;//in 为一个数的整数部分,fl为小数部分,x为第一个数,y为第二个数
Stack it(a);//实例化一个栈对象