1、利用栈求表达式的值题目:利用栈求表达式的值一设计任务和目标编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。主要功能描述如下:1、从键盘上输入表达式。2、分析该表达式是否合法:(1)是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。(2)是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。(3)若是其它字符,则返回错误信息。 主要功能描述如下:1、从键盘上输入表达式。2、分析该表达式是否合法:(1)是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。(2)是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。(3
2、)若是其它字符,则返回错误信息。程序应包括以下几个功能函数void initstack();初始化堆栈int Make_str();语法检查并计算int push_operate(int operate):将操作码压入堆栈int push_num(double num):将操作数压入堆栈int procede(int operate):处理操作码 int change_opnd(int operate):将字符型操作码转换成优先级int push_opnd(int operate):将操作码压入堆栈int pop_opnd();将操作码弹出堆栈int caculate(interru_opnd
3、):简单计算 +,-,*,/double pop_num():弹出操作数程序如下:#include stdio.h#include string.h#include stdlib.h#define MAXLEN 100typedef struct char op; int level;opt;typedef struct /定义操作符栈 opt stMAXLEN; int top;op_stack;typedef struct /定义值栈 double DMAXLEN; int top;D_stack;/-对栈操作的定义-opt peek(op_stack *s) /定义看栈顶函数 opt e
4、rror=; if(s-top=0) return s-sts-top; else return error;int IsEmpty(op_stack *s) /定义判断栈空的函数 if(s-topsts-top.op;char push(op_stack *s,opt c) /定义入栈函数 s-top+; s-sts-top=c; return c.op;opt pop(op_stack *s) /定义出栈函数 opt i; opt error=; if(s-top=0) i=s-sts-top; s-sts-top.op=0; s-top-; return i; else return e
5、rror;void clear(op_stack *s) /定义初始化栈 s-top=-1;/-define the value stack-double Dpeek(D_stack *s) /定义看栈顶函数 if(s-top=0) return s-Ds-top; else return 0;int DIsEmpty(D_stack *s) /定义判断栈空的函数 if(s-topDs-top);double Dpush(D_stack *s,double c) /定义入栈函数 s-top+; s-Ds-top=c; return c;double Dpop(D_stack *s) /定义出栈
6、函数 double i; if(s-top=0) i=s-Ds-top; s-Ds-top=0; s-top-; return i; else return 0;void Dclear(D_stack *s) /定义初始化栈 s-top=-1;double calval(char *exp) op_stack os; /定义两个栈 D_stack ds; char tmpMAXLEN=; int i=0,leng; double dtmp,dpoptmp; opt A=; opt R=; opt M=; opt D=; opt B=; opt Mo=; clear(&os); Dclear(&
7、ds); /-定义初始化结束- while(*exp!=0) while(*exp = 0 & *exp = 0 & *exp = 9 | *exp = .) tmpi+=*exp+; dtmp=atof(tmp); Dpush(&ds,dtmp); leng=strlen(tmp); for(i=0;ileng;i+) tmpi=0; i=0; /- switch(*exp) case + : if(!IsEmpty(&os) | peek(&os).level =A.level) switch(pop(&os).op) case %: dpoptmp=Dpop(&ds); dpoptmp=
8、(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case * : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case / : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; case +: dpoptmp=Dpop(&ds)+Dpop(&ds); Dpush(&ds,dpoptmp); break; case -: dpoptmp=Dpop(&ds)
9、; dpoptmp=Dpop(&ds)-dpoptmp; Dpush(&ds,dpoptmp); break; push(&os,A); *exp+; break; case -: if(!IsEmpty(&os) | peek(&os).level =R.level) switch(pop(&os).op) case % : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case * : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(
10、&ds,dpoptmp); break; case / : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; case +: dpoptmp=Dpop(&ds)+Dpop(&ds); Dpush(&ds,dpoptmp); break; case -: dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)-dpoptmp; Dpush(&ds,dpoptmp); break; push(&os,R); *exp+; break; case *: if(!IsEmpty(&os)
11、| peek(&os).level =M.level) switch(pop(&os).op) case % : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case * : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case / : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; push(
12、&os,M); *exp+; break; case /: if(!IsEmpty(&os) | peek(&os).level =D.level) switch(pop(&os).op) case % : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case * : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case / : dpoptmp=Dpop(&ds); dpoptmp=Dpop
13、(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; push(&os,D); *exp+; break; case %: if(!IsEmpty(&os) | peek(&os).level =Mo.level) switch(pop(&os).op) case % : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case * : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp);
14、 break; case / : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; push(&os,Mo); *exp+; break; case (: push(&os,B); exp+; break; case ): while(peek(&os).level!=-2) switch(pop(&os).op) case % : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp);
15、break; case * : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case / : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; case +: dpoptmp=Dpop(&ds)+Dpop(&ds); Dpush(&ds,dpoptmp); break; case -: dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)-dpoptmp; Dpush(&ds,dpoptmp); break; p
16、op(&os); /弹出 ( exp+; break; while(IsEmpty(&os) switch(pop(&os).op) case % : dpoptmp=Dpop(&ds); dpoptmp=(float)(int)Dpop(&ds)%(int)dpoptmp); Dpush(&ds,dpoptmp); break; case * : dpoptmp=Dpop(&ds)*Dpop(&ds); Dpush(&ds,dpoptmp); break; case / : dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)/dpoptmp; Dpush(&ds,dpoptmp); break; case +: dpoptmp=Dpop(&ds)+Dpop(&ds); Dpush(&ds,dpoptmp); break; case -: dpoptmp=Dpop(&ds); dpoptmp=Dpop(&ds)-dpoptmp; Dpush(&ds,dpoptmp); break; return Dpop(&ds);void main() char stringMAXLEN; char *p=string; printf(输入表达式:n); gets(p); printf(%s=%fnn,string,calval(p);