数据结构课程设计-表达式求值问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

相关文档
最新文档