1、利用栈求表达式的值利用栈求表达式的值编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。主要功能描述如下:1、从键盘上输入表达式。2、分析该表达式是否合法:(1)是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。(2)是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。(3)若是其它字符,则返回错误信息。3、若上述处理过程中没有发现错误,则认为该表达式合法,并打印处理结果。程序中应主要包含下面几个功能函数:void initstack():初始化堆栈int Make_str():语法检查并计算int push_operate(int o
2、perate):将操作码压入堆栈int push_num(double num):将操作数压入堆栈int procede(int operate):处理操作码int change_opnd(int operate):将字符型操作码转换成优先级int push_opnd(int operate):将操作码压入堆栈int pop_opnd():将操作码弹出堆栈int caculate(int cur_opnd):简单计算+,-,*,/double pop_num():弹出操作数源代码:#include #include #include #include #define MAXSIZE 100#d
3、efine N 1000int i=0;/表达式数typedef struct expression/表达式结构long double result;char expstrMAXSIZE;expression;expression exprN;/表达式的一个整体容器stypedef struct/操作码栈定义char codeMAXSIZE;int top;opnd;typedef struct/操作数栈定义double dateMAXSIZE;int top;num;/opnd栈操作:void initstack(opnd *op)/初始化栈op-top=-1;int empty_opnd(
4、opnd *op)/判空if(op-top=-1)return 0;else return 1;int push_opnd(opnd *op,char co)/压栈if(op-top=MAXSIZE-1)printf(The opnd stack is full.);return 0;op-top+;op-codeop-top=co;return 1;char pop_opnd(opnd *op)/出栈char a=0;if(op-top=-1)printf(error:The opnd stack is empty.);return a;a=op-codeop-top;op-top-;ret
5、urn a;char get_opnd(opnd *op)/查看栈顶char a=0;if(op-top=-1)printf(error:The opnd stack is empty.);return a;elsereturn op-codeop-top;/num栈操作:void initstack(num *nu)nu-top=-1;int empty_num(num *nu)/判空if(nu-top=-1)return 0;else return 1;int push_num(num *nu,double da)/压栈if(nu-top=MAXSIZE-1)printf(error:Th
6、e date stack is full.);return 0;nu-top+;nu-datenu-top=da;return 1;double pop_num(num *nu)/出栈double a=0;if(nu-top=-1)printf(error:The date stack is empty.);return a;a=nu-datenu-top;nu-top-;return a;double get_num(num *nu)/查看栈顶if(nu-top!=-1)return nu-datenu-top;/结束栈定义操作/函数操作:int change_opnd(char code)
7、/将字符型操作码转换成优先级,非表达式字符反回-2switch(code)case =:return 1;break;case ):return 2;break;case +:return 3;break;case -:return 3;break;case *:return 4;break;case /:return 4;break;case (:return 0;break;/操作码级别=0;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 0:case .: return -1;/操作数级别=-1;de
8、fault: return -2;/其它符号级别=-2char procede(char top,char code)/处理操作码,判断栈的操作if(change_opnd(code)=0)/“(”入栈return ();elseif(change_opnd(code)=2&change_opnd(top)=0)/“(”和“)”同时出现,“(”出栈,“)”不入栈return (=);elseif(change_opnd(code);elsereturn ();/入栈double change_num(char str)/数字字符串转成double型数字char *s=str;int p=1,q
9、=0;/p=小数点前位数,q=小数点后位数char d=.,z=0;double da=0,p1;if(strstr(str,d)=0)/判断是否有小数点p=strlen(str);elseif(strstr(str,d)=str)/没有输入小数点前的数,如“.032”p=1;q=strlen(str)-1;strcpy(str,strcat(z,str);elsep=strstr(str,d)-str;q=strlen(str)-p-1;for(int i=0;ip;i+)/小数点前的各位数乘以各自的阶数,然后叠加:123=1*100+2*10+3*1da=da+(int)stri-48)*
10、pow(10,p-i-1);for(int j=0;j0)printf(n表达式只能以“数字”或“(”开头。请重新输入:);gets(expri.expstr);p=expri.expstr;n=0;continue;elseif(change_opnd(*p)=-2)printf(n表达式%c为非法字符。请重新输入:,*p);gets(expri.expstr);p=expri.expstr;n=0;continue;else/合法刚跳到下一个字符p=p+1;continue;if(change_opnd(*p)=-2)/非法字符判断printf(n表达式%c为非法字符。请重新输入:,*p);gets(expri.expstr);p=expri.expstr;n=0;continue;if(change_opnd(*p)=0)/(前一个字符只能是+、-、*、/、(if(change_opnd(*
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1