1、 课 程 设 计报 告课程名称: 题目名称: 学生姓名: 学号: 数据结构算术表达式求值课程成绩: 二零一六 年 六 月1.需求分析本演示程序用 C+6.0 编写,完成栈的生成。(1)输入的形式和输入值的范围:输入合法表达式,以“#”结尾;输入的操作数是正整数,运算符只含加减乘除四种运算符。(2)输出的形式:显示输入是否正确、输入序列和栈的变化过程、计算结果。(3)程序所能达到的功能:完成算术表达式的计算。(4)测试数据:输入 3*(2+4)#;输入 5*2#。2.概要设计(1)为了实现上述程序功能,需要定义栈的抽象数据类型:ADT SqStack数据对象:D=a i| ai ElemSet,
2、i=1,2,3,n,n0数据关系:R1=| ai-1,ai D,i=1,2,3,,n基本操作:InitStack(SqStack SElemType *top;int stacksize;SqStack1;typedef struct /运算数栈SElemType2 *base;SElemType2 *top;int stacksize;SqStack2;(2)栈的基本操作void InitStack1(SqStack1 if(!S1.base)cout=S1.stacksize)/如果栈满,追加存储空间S1.base=(char *)realloc(S1.base,(S1.stacksize
3、+STACKINCREMENT)*sizeof(char);if(!S1.base) cout=S2.stacksize)/栈满,追加存储空间S2.base=(float *)realloc(S2.base,(S2.stacksize+STACKINCREMENT)*sizeof(float);if(!S2.base)cout;/否则,栈顶符号优先级高,返回“else if(n=*|n=/)/输入的符号为“*“、“/“if(m=)|m=*|m=/)return ;/栈顶元素为“)“、“*“、“/“,此时栈顶符号优先级高,返回“else return ;/否则,栈顶符号优先级高,返回“else
4、/输入符号为其他if(m=#)return=;/栈顶元素为“#“,此时优先级同,返回“=“else return ;/否则,栈顶符号优先级高,返回“float Operate(float a,char theta,float b)/运算函数float tmp=0;if (theta=+)tmp=a+b;/从运算符栈取出的符号为“+“,则运算数栈的两元素相加,并返回else if(theta=-)tmp=a-b;/从运算符栈取出的符号为“-“,则运算数栈的两元素相减,并返回else if(theta=*)tmp=a*b;/从运算符栈取出的符号为“*“,则运算数栈的两元素相乘,并返回else if
5、(theta=/) /从运算符栈取出的符号为“/“,则运算数栈的两元素相除,并返回if(b=0) cout#include#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef char SElemType;typedef float SElemType2;typedef struct /运算符栈SElemType *base;SElemType *top;int stacksize;SqStack1;typedef struct /运算数栈SElemType2 *base;SElemType2 *top;int stacksiz
6、e;SqStack2;/*运算符栈函数*/void InitStack1(SqStack1 if(!S1.base)cout=S1.stacksize)/如果栈满,追加存储空间S1.base=(char *)realloc(S1.base,(S1.stacksize+STACKINCREMENT)*sizeof(char);if(!S1.base) cout=S2.stacksize)/栈满,追加存储空间S2.base=(float *)realloc(S2.base,(S2.stacksize+STACKINCREMENT)*sizeof(float);if(!S2.base)cout;/否
7、则,栈顶符号优先级高,返回“else if(n=*|n=/)/输入的符号为“*“、“/“if(m=)|m=*|m=/)return ;/栈顶元素为“)“、“*“、“/“,此时栈顶符号优先级高,返回“else return ;/否则,栈顶符号优先级高,返回“else /输入符号为其他if(m=#)return=;/栈顶元素为“#“,此时优先级同,返回“=“else return ;/否则,栈顶符号优先级高,返回“float Operate(float a,char theta,float b)/运算函数float tmp=0;if (theta=+)tmp=a+b;/从运算符栈取出的符号为“+“
8、,则运算数栈的两元素相加,并返回else if(theta=-)tmp=a-b;/从运算符栈取出的符号为“-“,则运算数栈的两元素相减,并返回else if(theta=*)tmp=a*b;/从运算符栈取出的符号为“*“,则运算数栈的两元素相乘,并返回else if(theta=/) /从运算符栈取出的符号为“/“,则运算数栈的两元素相除,并返回if(b=0) coutch;c=ch0;cout=0)e=float(c-48);n+;if(n=1)t=e;else if(n1)t=t*10+e;c=chs+;if(n=-1)e=float(c-48);t=t+e/10;c=chs+;if(c=.)n=-1;c=chs+;if(c=0 cout:/栈顶元素优先级高,则退栈并将运算结果入栈p1=Pop2(S2);p2=Pop2(S2);ch1=Pop1(S1);Push2(S2,Operate(p2,ch1,p1);cout“ttOperate(“p2,ch1,p1);flag=1;break;