1、数据对象:D=ai|aiCharSet,i=1,2,,n,n0数据关系:R1=| aiD,i=2,,n基本操作:InitStack(&S)操作结果:构造一个空栈S。GetTop (S,&e)初始条件:栈S已存在。若栈S不空,则以e返回栈顶元素。Push(&S, e)在栈S的栈顶插入新的栈顶元素e。Pop(&S, &删除S的栈顶元素,用e返回其值。 ADTStack2.设定运算表达式的抽象数据类型为:ADT EvaluateExpressioni| ai为数字及运算符,i=1,2,,n,n0R1= Precede(a1 , a2)字符a1,a2存在。判定运算符的优先级In( d )字符d存在。判
2、断c是否为七种运算符之一Operate(a,theta, b )字符a,theta, b存在。运算表达式结果。 ADT EvaluateExpression3.本程序包含3个模块:(1)主程序模块:int main()初始化;do接受命令:处理命令:return 0;(2)栈模块实现栈抽象数据类型(3)求解算术表达式模块实现算术表达式数据类型各模块之间的调用关系如下:主程序模块栈模块求解算术表达式模块三、详细设计1.数据类型、字符类型。typedef double SElemType;/数据类型char Precede(char a1 ,char a2)char r; /字符类型2.栈类型ty
3、pedef struct SqStackSElemType *base;SElemType *top;int stacksize;SqStack;栈的基本操作设置如下:void InitStack (SqStack &S)/构造一个空栈boolGetTop(SqStackS,SElemType&e)/若栈不空,则用e返回S的栈顶元素,并返回true;否则返回falsebool Push(SqStack &S,SElemType e) /插入元素为e的新的栈顶元素boolPop(SqStack&S,SElemType&e)/若栈不空,则删除S的栈顶元素,用e返回其值其中部分操作的算法:S,SEl
4、emType e)/插入元素为e的新的栈顶元素if(S.top-S.base=S.stacksize)/栈满,追加存储空间S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType);if(!S.base)exit(-1);/存储空间分配失败S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;/top自增return true;boolPop(SqStack&if(S.top=S.base)return false;e=*
5、-S.top;/删除一个元素,top减一return true ;3.求解算术表达式的伪算法SElemType EvaluateExpression( )SqStack OPTR,OPND;/OPTR和OPND分别为运算符栈和运算数栈charc;char Data20;/定义此数组为了存放整数或小数SElemType a,b,d,e;InitStack(OPTR);/构造一个运算符栈InitStack(OPND);/构造一个运算数栈Push(OPTR,n);/将换行符压入栈底c=getchar();GetTop(OPTR,e);while(c!=|e!)/栈顶不是换行符且输入不是换行符if(I
6、n(c)/是符号则进栈switch(Precede(e,c)case/退栈并将运算结果入栈Pop(OPND,b);Pop(OPND,a);Push(OPND,Operate(a,e,b);else if(c0&c9|c=.)Push(OPND,c-48);elsecouterror!输入错误!endl;GetTop(OPND,e);return e;4.主函数和其他函数的伪算法int main()/主程序SElemTyperesult;/初始定义请输入表达式/输出输入要求result=EvaluateExpression();/执行函数操作命令结果为:result/输出结果char Prece
7、de(char a1 ,char a2)/判定运算符的优先级函数。switch(a2)+-/加减运算优先级相同if(a1=(|a1=r=;*/ /乘除运算优先级相同)括号匹配错误!else if(a1=没有左括号exit (-1);switch(a1)没有右括号default:return r;bool In(char d)/判断c是否为七种运算符之一的函数switch(d)5.函数的调用关系图反映了演示程序的结构层次:主程序InitializationReadCommandInterpretInit EvaluateExpressionPrintEvaluateExpressionInitS
8、tackPushPopGetTop四、调试分析1.这次作业思路比较简单,核心问题就是表达式的运算,要区分运算符的优先顺序。通过运用栈后进先出的特点实现算法功能,调用push和pop等函数,实现一系列操作。2.调试过程中,起初想打换行符时打成了,忘了打字母n,结果程序调试总是有错误,改成n后便成功运行了,可见,细节之处也很重要。3.运用了很多的栈的基本操作,让我对栈的内容熟悉了不少,收获很大。4本题中时间复杂度为O(n)五、用户手册本程序的运行环境为DOS操作系统,执行文件为:EvaluateExpression.exe。六、测试结果(1)请输入表达式:3*(7-2);结果为:15(2)请输入表达式:8;8(3)请输入表达式:1+2+3+4;10(4)请输入表达式:88-1*5;82(5)请输入表达式:1024*4/8;512(6)请输入表达式:(20+2)*(6/2);6(7)请输入表达式:3-3-3;-3(8)请输入表达式:8/(9-9);除数不能为零(9)请输入表达式:2*(6+2*(3+6*(6+6);312(10)请输入表达式:(6+6)*6+3)*2+6)*2;七、附录源代码见“源程序文档”
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1