1、表达式的求解一、设计课题表达式的求解二、需求分析1、用一个一维数组存放从键盘输入的表达式;2、表达式中可包含:加(+) 、减(- ) 、乘(*) 、除(/ ) 、单目减(-) 、乘方() 、括号(,) )等运算符。3、 要对输入的表达式进行检查,看是否是合格的表达式,如遇到错误则终止,不进行计算;例如:括号不配对、除数不为零等;三、概要设计 1、定义栈的抽象数据类型定义:ADT Stack数据对象: D=ai| aiDateType,i=1,2, ,n,n=0数据关系: R1=| ai-1,aiD,i=2,n基本操作:InitStack(typedef int SElemType;typede
2、f struct/栈的定义 SElemType *base;SElemType *top;int stacksize;SqStack;Status InitSqStack(SqStack if(!S.base) exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;Status Push(SqStack if(!S.base) exit(OVERFLOW);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;return OK;Status P
3、op(SqStack elsee=*-S.top;return OK;Status GetTop(SqStack S)/取栈顶元素,用 e 带回if(S.top = S.base)return ERROR;elsereturn *(S.top-1);Status Match(char *str)/括弧、字符范围匹配SqStack S;int hasErr=0,i=0;SElemType e;InitSqStack(S);char ch;while(ch=*(str+i)!=# break;case ):if(S.top=S.base)hasErr=1;break;elsePop(S,e);if
4、(e!=()hasErr=1;break;break;+i;if(!(hasErr=0 return FALSE;for(i=0;(ch=*(str+i)!=#;+i)if(ch=(|ch=)|ch=+|ch=-|ch=*|ch=/|ch=%|ch=|ch=#|(ch-0)=0else return ;case :if(=b)return ;case (:if()=b)return =;else return 9 )int theta,x, a,b;switch(Precede(GetTop(OPTR),ch)/比较栈顶运算符与 c 的优先级case :Pop(OPTR,theta);Pop(
5、OPND,b);Pop(OPND,a);Push(OPND,Operate(a,theta,b);break;elsewhile(ch-0) = 0 +i;ch=*(str+i);Push(OPND,n);/操作数直接入栈return GetTop(OPND);int main()char str200;printf(“请输入表达式,以#结束:n“);scanf(“%s“,str);strstrlen(str)+1=0;if(FALSE = Match(str)printf(“重新输入表达式:n“);scanf(“%s“,str);strstrlen(str)+1=0;printf(“表达式的值为:%dn“,CalculataExpression(str);五、测试结果1、六、附录表达式.cpp七、评价 由于时间仓促 经验不足还有很多功能没有实现完善。