算术表达式求值演示

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

实习报告

题目:算术表达式求值演示。

一、需求分析

1.以字符序列的形式从终端输入语法正确的、不含变量的整数表

达式。

2.利用教科书表

3.1给出的算符优先关系,实现对算数四则混合运

算表达式的求值。

3.仿照教科书的例子在求值中运用符栈、运算数栈、输入字符和

主要操作的变化过程。

4.程序执行的命令包括:

(1)构造空栈;

(2)判断符号优先级;

(3) 判断是否为七种运算符之一;

(4)运算求解算术表达式。

5.测试数据

(1)3*(7-2);

(2)8;

(3)1+2+3+4;

(4)88-1*5;

(5)1024*4/8;

(6)(20+2)*(6/2);

(7)3-3-3;

(8)8/(9-9);

(9)2*(6+2*(3+6*(6+6)));

(10)(((6+6)*6+3)*2+6)*2;

二、概要设计

1.设定栈的抽象数据类型定义:

ADT Stack{

数据对象:D={a i|a i∈CharSet,i=1,2,…,n,n≥0} 数据关系:R1={< a i-1,a i >| a i-1, a i∈D,i=2,…,n} 基本操作:

InitStack(&S)

操作结果:构造一个空栈S。

GetTop (S,&e)

初始条件:栈S已存在。

操作结果:若栈S不空,则以e返回栈顶元素。Push(&S, e)

初始条件:栈S已存在。

操作结果:在栈S的栈顶插入新的栈顶元素e。Pop(&S, &e)

初始条件:栈S已存在。

操作结果:删除S的栈顶元素,用e返回其值。} ADT Stack

2.设定运算表达式的抽象数据类型为:

ADT EvaluateExpression{

数据对象:D={a i| a i为数字及运算符,i=1,2,…,n,n≥0}数据关系:R1={ }

基本操作:

Precede(a1 , a2)

初始条件:字符a1,a2存在。

操作结果:判定运算符的优先级

In( d )

初始条件:字符d存在。

操作结果:判断c是否为七种运算符之一

Operate(a, theta, b )

初始条件:字符a, theta, b存在。

操作结果:运算表达式结果。

} ADT EvaluateExpression

3.本程序包含3个模块:

(1)主程序模块:

int main()

{

初始化;

do{

接受命令:

处理命令:

}

return 0;

}

(2)栈模块——实现栈抽象数据类型

(3)求解算术表达式模块——实现算术表达式数据类型各模块之间的调用关系如下:

主程序模块

栈模块

求解算术表达式模块

三、详细设计

1.数据类型、字符类型。

typedef double SElemType;// 数据类型

char Precede(char a1 ,char a2)

{

char r; //字符类型

}

2.栈类型

typedef struct SqStack {

SElemType *base;

SElemType *top;

int stacksize;

}SqStack;

栈的基本操作设置如下:

void InitStack (SqStack &S)//构造一个空栈

bool GetTop (SqStack S,SElemType &e) //若栈不空,则用e返回S 的栈顶元素,并返回true;否则返回false

bool Push(SqStack &S,SElemType e) //插入元素为e的新的栈顶元素bool Pop(SqStack &S,SElemType &e)//若栈不空,则删除S的栈顶元素,用e返回其值

其中部分操作的算法:

bool Push(SqStack &S,SElemType e)

{ //插入元素为e的新的栈顶元素

if(S.top-S.base>=S.stacksize)

{ //栈满,追加存储空间

S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*size of(SElemType));

if(!S.base)

exit(-1); //存储空间分配失败

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREMENT;

}

*S.top++=e;//top自增

return true;

}

bool Pop(SqStack &S,SElemType &e)//若栈不空,则删除S的栈顶元素,用e返回其值

{

if(S.top==S.base)

return false;

e=*--S.top; //删除一个元素,top减一

return true ;

}

3. 求解算术表达式的伪算法

SElemType EvaluateExpression( ){

SqStack OPTR,OPND;//OPTR和OPND分别为运算符栈和运算数栈char c;

char Data[20];//定义此数组为了存放整数或小数

SElemType a,b,d,e;

InitStack(OPTR);//构造一个运算符栈

相关文档
最新文档