利用栈求表达式的值课程设计最后老师改- 副本 联系客服

发布时间 : 星期三 文章利用栈求表达式的值课程设计最后老师改- 副本更新完毕开始阅读

4.2函数间的调用关系

main() Exit() Stack1() load() Check() result() shown() Start2() save() 图4-2函数关系调用图

4.3函数调用详细说明

main()函数:调用了一个函数stack1(),stack1()判断执行查看所有计算记录函数load(),或是清空以往的所有计算记录,或是退出程序,或是检查输入表达式语法check()并计算表达式result(op,nu)的操作。

void main() { czm op; //操作码栈 czs nu; //操作数栈 printf(\用栈计算表达式------------------------\\n\\n\

warning(); stack1(&op,&nu);//启动程序 }

13

result(op,nu)函数:是计算表达式,调用了初始化栈函数和字符级别判断change_opnd(*ps),若是数字,则调用转化数字change_num(str2)然后压入操作数栈,若是运算符,刚调用判断操作procede(get (op),*ps),若是“<”,则压入操作码栈push (op,*ps),若是“=”,则弹出操作码栈顶pop (op),若是“>”,则弹出操作码栈的栈顶元素和操作数栈的两个栈顶元素,进行运算caculate(op,nu)后再压入操作数栈,计算完毕后按stack1()顺序运行。 void result(czm *op,czs *nu)//计算结果 { char str2[MAXSIZE]=\ char *ps=EXPRESS[i].express; initstack(op);//初始化栈 Initstack(nu); push(op,'='); while(!((*ps=='=')&&(get(op)=='=')))//检查是表达式和操作码是否到尾

if(change_opnd(*ps)==-1)//操作数处理 { while(change_opnd(*ps)==-1) { strncpy(str3,ps,1);//数字字符一个个取出放在str2 strcat(str2,str3); ps++; } Push(nu,change_num(str2)); strcpy(str2,\ } else //操作码处理 { switch(procede(get(op),*ps)) { case '<':push(op,*ps);break; case '=':pop(op);break; case '>':Push(nu,caculate(op,nu));continue;break; } if(*ps==')'&&get(op)=='=') { ps++; continue; } if(*ps=='='||get(op)=='=')

14

continue;//表达式和操作码有一个到尾,则跳出继续循环

ps++; } EXPRESS[i].result=Get(nu); printf(\ 表达式:%s\\t计算结果:%lf\\n\

printf(\--------------\\n\

i++;//表达式个数加1; }

stack2()函数:在计算结果后调用跟随的选择菜单,进行查看结果shown()、保存结果save()、查看计算记录load()、回到主菜单的操作。

void stack2(czm *op,czs *nu)//第二层计算选择菜单 { char ch; char out; while(1) { next: printf(\--------------\\n\ printf(\查看本次计算记录,请输入\\\或\\\ printf(\保存本次计算记录,请输入\\\或\\\ printf(\查看所有计算记录,请输入\\\或\\\ printf(\回到主菜单,按任意键返回:\ scanf(\ out = getchar(); if ( out != '\\n' ) { printf(\ fflush(stdin); goto next; } if(ch=='r'||ch=='R') shown(); else if(ch=='s'||ch=='S')

15

}

save(); else

if(ch=='l'||ch=='L') load(); else {

i=0;

stack1(op,nu); } }

4.4数据结构设计

1)表达式可以用一个字符串表示,计算结果可以用一个双精度浮点数即小数表示,结构简单,可以使用一段连续的地址空间,故定义一个结构体表示即可。定义如下:

struct expression {

double result;

//表达式结构

char express[MAXSIZE];

}EXPRESS[N];

2)使用栈计算表达式时可以定义两个栈——存放数字的操作数栈(czs)和存放计算字符(+、-、*、/、(、))的操作码栈(czm)。它们的定义如下: typedef struct {

char code[MAXSIZE]; int top;

//操作码栈定义

}czm;

typedef struct {

double data[MAXSIZE];

16

//操作数栈定义