1、int change_opnd(int operate):将字符型操作码转换成优先级int push_opnd(int operate):int pop_opnd():将操作码弹出堆栈int caculate(int cur_opnd):简单计算+,-,*,/double pop_num():弹出操作数源代码:#include stdlib.hstring.hmath.h#define MAXSIZE 100#define N 1000int i=0;/表达式数typedef struct expression/表达式结构long double result;char expstrMAXSIZ
2、E;expression;expression exprN;/表达式的一个整体容器stypedef struct/操作码栈定义char codeMAXSIZE;int top;opnd;typedef struct/操作数栈定义double dateMAXSIZE;num;/opnd栈操作:void initstack(opnd *op)/初始化栈op-top=-1;int empty_opnd(opnd *op)/判空if(op-top=-1)return 0;else return 1;int push_opnd(opnd *op,char co)/压栈top=MAXSIZE-1)prin
3、tf(The opnd stack is full.);top+;codeop-top=co;return 1;char pop_opnd(opnd *op)/出栈char a=0;error: stack is empty.return a;a=op-top;top-;char get_opnd(opnd *op)/查看栈顶elsereturn op-/num栈操作:void initstack(num *nu)nu-int empty_num(num *nu)/判空if(nu-int push_num(num *nu,double da)/压栈datedatenu-top=da;doubl
4、e pop_num(num *nu)/出栈double a=a=nu-double get_num(num *nu)/查看栈顶top!=-1)return nu-/结束栈定义操作/函数操作:int change_opnd(char code)/将字符型操作码转换成优先级,非表达式字符反回-2switch(code)case =:break;)return 2;+return 3;-*return 4;/(/操作码级别=0;1234567890. return -1;/操作数级别=-1;default: return -2;/其它符号级别=-2char procede(char top,char
5、 code)/处理操作码,判断栈的操作if(change_opnd(code)=0)/“(”入栈return (if(change_opnd(code)=2&change_opnd(top)=0)/“(”和“)”同时出现,“(”出栈,“)”不入栈if(change_opnd(code)/入栈double change_num(char str)/数字字符串转成double型数字char *s=str;int p=1,q=0;/p=小数点前位数,q=小数点后位数char d=.,z=0double da=0,p1;if(strstr(str,d)=0)/判断是否有小数点p=strlen(str)
6、;if(strstr(str,d)=str)/没有输入小数点前的数,如“.032”p=1;q=strlen(str)-1;strcpy(str,strcat(z,str);p=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)*pow(10,p-i-1);for(int j=0;j0)n表达式只能以“数字”或“(”开头。if(change_opnd(*p)=-2)n表达式%c为非法字符。,*p);/合法刚跳到下一个字符p=p+1;if(change_opnd(*p)=-2)/非法字符判断if(change_opnd(*p)=0)/前一个字符只能是+、-、*、/、(if(change_opnd(*
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1