NYOJ 35 表达式求值
2012-08-03 07:55
351 查看
#include<stdio.h> #include<stdlib.h> #define N 1010 char s ; //字符栈的操作 typedef struct { char *base; char *top; }SqStack1; int InitStack1(SqStack1 &S) { S.base=(char *)malloc(N*sizeof(char)); if(!S.base) exit(1); S.top=S.base; return 1; } int StackEmpty1(SqStack1 &S) { if(S.top==S.base) return 1; return 0; } char GetTop1(SqStack1 S) { char e; if(S.top==S.base) return 0; e=*(S.top-1); return e; } int Push1(SqStack1 &S,char e) { *S.top++=e; return 1; } int Pop1(SqStack1 &S,char &e) { if(S.top==S.base) return 0; e=*--S.top; return 1; } //数字栈的操作 typedef struct { float *base; float *top; }SqStack2; int InitStack2(SqStack2 &S) { S.base=(float *)malloc(N*sizeof(float)); if(!S.base) exit(1); S.top=S.base; return 1; } int StackEmpty2(SqStack2 &S) { if(S.top==S.base) return 1; else return -1; } float GetTop2(SqStack2 S) { float e; if(S.top==S.base) return 0; e=*(S.top-1); return e; } int Push2(SqStack2 &S,float e) { *S.top++=e; return 1; } int Pop2(SqStack2 &S,float &e) { if(S.top==S.base) return 0; e=*--S.top; return 1; } //转化的操作过程 float Operate(float a,char theta,float b) { switch(theta) { case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; default: return 0; } } int level(char c,int i) { switch(c) { case '=': return 1; case ')': return i?2:5; case '+': case '-': return 3; case '*': case '/': return 4; case '(': return i?5:2; default : return 0; } } char Precede(char c1,char c2) { int k=(c1=='('&&c2=='=')||(c1=='='&&c2==')')||(c1==')'&&c2=='('); if(!k) { if(c1=='('&&c2==')') return '='; else { if(level(c1,0)<level(c2,1)) return '<'; else return '>'; } } return 0; } float Evaluateexpression_r() { SqStack1 OPTR; SqStack2 OPND; char theta,c,x; float a,b,k,t; char *p1,*p=s; InitStack1(OPTR); Push1(OPTR,'='); InitStack2(OPND); c=*p; while(c!='='||GetTop1(OPTR)!='=') { if(!level(c,1)) { for(t=k=0;!level(c,1)&&c!='.';c=*++p) //之前的提交错在这里,t应在这里清0,防止上次数据被多读 k=10*k+c-'0'; if(c=='.') { while(!level(*++p,1)); c=*p; for(p1=p-1;*p1!='.';p1--) //原先我把t放在这个for()语句中,导致出错! t=0.1*t+*p1-'0'; t*=0.1; } Push2(OPND,k+t); //应为这里是k+t } else switch(Precede(GetTop1(OPTR),c)) { case'<': Push1(OPTR,c);c=*++p;break; case'=': Pop1(OPTR,x); c=*++p;break; case'>': Pop1(OPTR,theta); Pop2(OPND,b); Pop2(OPND,a); Push2(OPND,Operate(a,theta,b)); } } return GetTop2(OPND); } //主函数 int main() { int n; scanf("%d%*c",&n); while(n--) { gets(s); printf("%.2f\n",Evaluateexpression_r()); } return 0; }
相关文章推荐
- NYOJ-35-表达式求值
- nyoj 35 表达式求值(栈)
- NYOJ 35 表达式求值(栈)
- nyoj 题目35 表达式求值
- nyoj 35 表达式求值
- NYOJ 35 表达式求值 (中缀表达式 小数 带括号)
- NYOJ 35表达式求值
- NYOJ - 35 表达式求值
- nyoj35表达式求值
- nyoj 35 表达式求值(栈)
- NYOJ 35 表达式求值(非递归+栈)
- nyoj35——表达式求值
- 南阳 oj 表达式求值 题目35 数据结构 NYOj
- nyoj 35 表达式求值(栈)
- NYOJ35——表达式求值
- 【表达式求值】中缀表达式变后缀+后缀表达式的求法 (NYOJ 35+NYOJ 1272表达式求值)
- nyoj35 表达式求值
- nyoj 35 表达式求值<模拟+栈>
- NYOJ 35 表达式求值
- NYOJ 35 表达式求值