数据结构课程设计-表达式求值问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嘉应学院计算机学院
实验报告
课程名称:数据结构课程设计
开课学期:2017-2018学年第2学期
班级:
指导老师:
实验题目:学生通讯录管理系统
学号:
姓名:
上机时间:
(一) 需求分析
1、输入的形式和输入值的范围:
根据题目要求与提示,先选择你要使用的表达式形式(中缀用1,后缀用0),在输入一个中缀表达式,输入数的范围为int型,此时,程序将计算出表达式的结果。
2、输出的形式:
当按照程序要求选择了1或0之后,再输入表达式;如果选择的是1,则程序将自动运算出表达式结果;如果之前选择的是0,则程序将现将中缀表达式转化为后缀表达式并计算出结果。
3、程序所能达到的功能:
本程序能计算出含+、-、*、/、(、)等运算符的简单运算。
4、测试数据:
输入一个表达式,如果你之前选择的是“中缀表达式”,那么输入5*(4-2)#,那么输出结果是10;如果之前选择的是“后缀表达式”,那么输入5*(4-2)#,那么他将先转换成后缀表达式5 4 2 - * #,再输出结果10。
如果输入表达式没有结束标示符#,如5*(4-2),那将不会输出任何结果,或出现错误结果。
(二) 概要设计
为了实现上述操作,应以栈为存储结构。
1.基本操作:
(1). int GetTop(SqStack *s)
初始条件:栈存在;
操作结果:若栈为空,则返回s的栈顶元素;否则返回ERROR。
(2). void Push(SqStack *s,int e)
初始条件:栈存在;
操作结果:插入e为新的栈顶元素。
(3). int Pop(SqStack *s)
初始条件:栈存在;
操作结果:若栈不空,则删除之,并返回其值;否则返回REEOR。
(4).void InitStack(SqStack *s)
初始条件:栈存在;
操作结果:置栈为空。
(5). int Empty(SqStack *s)
初始条件:栈存在;
操作结果:判定s是否为空栈。
(6). int Operate(int a,char theta, int b)
初始条件:操作数a和b存在,且theta是+、-、*、/四则运算;
操作结果:返回a与b间theta运算的结果。
(7). int In(char s,char* TestOp)
初始条件:s为待判断字符,TestOp为已知的算符集合;
操作结果:s为算符集合中的元素则返回1,否则返回0.
(8). int ReturnOpOrd(char op,char* TestOp)
初始条件:op为待确定运算符,TestOp为已知的算符集合;
操作结果:确定运算符类型。
(9). char precede(char a, char b)
初始条件:a、b存在;
操作结果:返回算符a和b的优先权高低。
(10). void PrintOpnd(SqStack *s)
初始条件:栈存在;
操作结果:输出运算数栈。
(11). void PrintOptr(SqStack *s)
初始条件:栈存在;
操作结果:输出运算符栈。
(12). void Store(char *s,char ch)
初始条件:字符数组 s存在,字符ch已知;
操作结果:将ch存入数组s。
(13). void Change(char *s1,char *s2)
初始条件;重罪表达式s1已知;
操作结果:将中缀表达式s1转为后缀表达式s2。
2.本程序包含二个模块:
(1)主程序模块;
(2)中缀表达式求值模块以及中缀表达式转换为后缀表达式并求值模块(3)模块调用图:
主程序模块
中缀表达式求值模块中缀表达式转换为后缀表达式并求值模块
(三) 详细设计
1.存储类型,元素类型,结点类型:
typedef struct{ //定义栈
int data[SIZE];
int top;
int base;
}SqStack;
char OPSET[7]={'+' , '-' , '*' , '/' ,'(' , ')' , '#'};
//定义OPSET字符数组为算符集合
char Prior[7][7] = {
// 算符间的优先关系
'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=',' ',
'>','>','>','>',' ','>','>',
'<','<','<','<','<',' ','='
};
2.每个模块的分析:
(1)主程序模块:
int main(){
char s=0,c;
while(1){
printf("请输入‘1’或‘0’(1代表中缀表达式,0代表后缀表达式)\n");
c=getchar();
fflush(stdin);
if(c=='1'){//中缀表达式运算结果
printf("%d\n",EvaluateExpression_1());
}
else{//后缀表达式运算结果
printf("%d\n",EvaluateExpression_2());
}
do{
scanf("%c",&s);
if(s=='q'||s=='Q')
exit(0);
}
while(s!='\n');
system("cls");
}
return 0;
}
(2)int EvaluateExpression_1(){
//中缀求值
SqStack OPND,OPTR;
char ch,theta,exp[100]={0};
int i=0,s=0,a=0,b=0,step=0;
InitStack(&OPND);
InitStack(&OPTR);
Push(&OPTR,'#');
gets(exp);
ch=exp[0];
while(ch!='#'||GetTop(&OPTR)!='#'){
if(!In(ch,OPSET)){//不是运算符则进栈
if(In(exp[i+1],OPSET)){//未出现连续数字
Push(&OPND,ch-48);
ch=exp[++i];
}//if
else//出现连续数字
{
s=exp[i++]-48;
while(exp[i]>='0'&&exp[i]<='9'){
s=s*10+exp[i++]-48;
}