数据结构实验报告 逆波兰表达式

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);//实例化一个栈对象

for(int i=0;i

if(p[0]==46){

cout<<"表达式有误"<

break;

}

else if(p[i]>47 && p[i]<58){//字符对应的数在48~57的范围是数字

if(t)//若是整数

in=in*10+(p[i]-48);

else//小数

fl=fl+(p[i]-48)*pow(0.1,k++);//pow(x,y)函数计算x的y次幂

}

else if(p[0]!=46 && p[i]==46){//若是小数点则记录t=0

if(t==0){//已记录则跳出

cout<<"表达式有误"<

break;

}

else{

t=0;//有小数

k=1;

}

}

else if(p[i]==' '){

//第一个数整数部分和小数部分进栈

it.push(in+fl);

//此时无数,复原

in=0;

fl=0;

t=1;

k=0;

}

//若为运算符则令数出栈运算然后再将结果入栈

else if(p[i]==42 ||p[i]==43 ||p[i]==45 ||p[i]==47 ){

//第二个数整数部分和小数部分进栈

it.push(in+fl);

//令第二个和第一个数依次出栈

y=it.pop();

x=it.pop();

if(p[i]=='+')

it.push(x+y);

else if(p[i]=='-')

it.push(x-y);

else if(p[i]=='*')

it.push(x*y);

else if(p[i]=='/'){

if(y==0){

cout<<"分母为0!表达式有误"<

相关文档
最新文档