文档详情

实习报告二算术表达式求值演示-Read.DOC

发布:2019-03-21约7.33千字共14页下载文档
文本预览下载声明
实习报告二 算术表达式求值演示 题目:设计一个程序,演示用算符优先法对算术表达式求值的过程 班级:计算机05(2) 姓名:刘丹华 学号:22120051203932 完成日期2007.10.27 Email:liudanhua1234@126.com 需求分析 本演示程序中,要求用户以字符序列的形式从终端输入语法正确的,不含变量的整数表达式并以‘#’结束。 由于算符有优先关系,可用栈来实现。设置运算符栈来接收运算符,优先权低的压入栈内,优先权高的进行运算,设置运算数栈来接收运算数,并存储中间的运算结果。 在读入字符序列的同时,完成运算符合运算数(整数)的识别处理,以及相应的运算,在识别出是运算数的同时,将当前字符序列转换成整数形式 运算结果显示在求值过程中运算符栈、运算数栈、当前字符和主要操作的变化过程。 测试数据: 1)、3*(7-2) 2)、8 3)、1+2+3+4 4)、88-1*5 5)、1024/4*8 6)、1024/(4*8) 7)、(20+2)*(6/2) 8)、3-3-3 9)、8/(9-9) 10)、2*(6+2*(3+6*(6+6))) 11)、(((6+6)*3)*2+6)*2 概要设计 设定运算符栈的抽象数据类型定义: ADT OPTR{ 数据对象:D={ ai∣ai∈CHAR,i=1,2…,n,n=0} 数据关系:R1={ai-1,ai | ai-1,ai∈D,i=2,…,n} 约定an端为栈顶,a1 端为栈底 基本操作: InitStack1(S) //构造一个空栈S,其中元素为CHAR型 GetTop1(S) //若栈不空,则用e返回S的栈顶元素,e为CHAR型 Push1(S,e) //插入e元素为新的栈顶元素,e为CHAR型 Pop1(S,e) //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR,e为CHAR型 PrintStack1(S,m) //若栈S不空,则从栈底到栈顶输出S的元素(为CHAR型),并用m返回打印长度 }ADT OPTR 2、设定运算数栈的抽象数据类型定义: ADT OPND{ 数据对象:D={ ai∣ai∈ INT,i=1,2…,n,n=0} 数据关系:R1={ai-1,ai | ai-1,ai∈D,i=2,…,n} 约定an端为栈顶,a1 端为栈底 基本操作: InitStack2(S) //构造一个空栈S,其中元素为INT型 GetTop2(S) //若栈不空,则用e返回S的栈顶元素,e为INT型 Push2(S,e) //插入e元素为新的栈顶元素,e为INT型 Pop2(S,e) //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR,//e为INT型 PrintStack1(S,n) //若栈S不空,则从栈底到栈顶输出S的元素(为INT型),并用n返回打印长度 }ADT OPND 详细设计 运算符栈的实现: #define STATACK_INIT_SIZE 100//存储空间初始分配量 #define STACKINCREMENT 10// 存储空间分配增量 typedef int Status; typedef struct{ char *base; //栈底指针,在栈构造之前和销毁之后,base的值为NULL char *top; //栈顶指针 int stacksize;// //当前已分配的存储空间,以元素为单位 }SqStack1;//运算符栈 基本操作的算法: Status InitStack1(SqStack1 S)//构造一个空栈S,其元素类型为char型 { S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); if(!S.base) return OVERFLOW;//存储分配失败 S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; }//InitStack1 char GetTop1(SqStack1 S)//若栈不空,则返回S的栈顶元素 { if(S.top!=S.base) return *(S.top-1); }//GetTop1 Status Push1(SqStack1 S,char e)//插入元素e为新的栈顶元素 { if(S.top-S.base=S.stacksize)//栈满,追加存储空间 { S.base=(char *)realloc(S.base,(S.stacks
显示全部
相似文档