nyoj267 郁闷的C小加(二)
2012-08-02 08:37
218 查看
#include<stdio.h> #include<stdlib.h> #define N 1010 char s ; int i; //字符栈的操作 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/2*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 k) { switch(c){ case '=': return 1; case ')': return k?2:5; case '+': case '-': return 3; case '*': case '/': return 4; case '(': return k?5:2; case ' ': return 6; default : return 0; } } int Precede(char c1,char c2) { if(level(c1,0)<level(c2,1)||c1=='='&&c2=='=') return 0; return 1; } int Converse(char *s) { SqStack1 OPTR; char ch,x,c=getchar(); InitStack1(OPTR); Push1(OPTR,'='); while(!StackEmpty1(OPTR)){ if(!level(c,1)) s[i++]=c; else switch(c){ case '(': Push1(OPTR,c);break; case ')': Pop1(OPTR,ch);while(ch!='('){s[i++]=ch;Pop1(OPTR,ch);}break; default : ch=GetTop1(OPTR); while(Precede(ch,c)){ s[i++]=ch; Pop1(OPTR,ch); ch=GetTop1(OPTR); } if(c!='=') Push1(OPTR,c); break; } if(c!='='){ x=c; c=getchar(); if(!level(x,1)&&level(c,1)) s[i++]=' '; } else{ Pop1(OPTR,ch); s[i++]=ch; } } s[i]='\0'; return 1; } float EvaluateExpression() { SqStack2 OPND; InitStack2(OPND); float k,t; char *p1,*p=s; char c=*p; while(c!='='){ for(t=k=0;!level(c,1)&&c!='.';c=*++p) k=10*k+c-'0'; if(c=='.'){ while(level(*++p,1)!=6); c=*p; for(p1=p-1;*p1!='.';p1--) t=0.1*t+*p1-'0'; t*=0.1; } Push2(OPND,k+t); c=*++p; while(level(c,1)==3||level(c,1)==4){ Pop2(OPND,k); Pop2(OPND,t); Push2(OPND,Operate(t,c,k)); c=*++p; } } return GetTop2(OPND); } //主函数 int main() { int j,n; scanf("%d",&n); while(n--){ getchar(); i=0; Converse(s); for(j=0;s[j];++j){ if(s[j]==' ') continue; putchar(s[j]); } printf("\n%.2f\n",EvaluateExpression()); if(n) putchar('\n'); } return 0; }
相关文章推荐
- NYOJ 267 郁闷的C小加(二)
- NYOJ 267 郁闷的C小加(二)
- 中缀式转后缀表达式 -NYOJ 题目267郁闷的C小加(二)
- NYOJ 267 郁闷的C小加(二)
- NYOJ 267 郁闷的C小加(二)
- nyoj267郁闷的c小加 中缀表达式转后缀求值
- NYOJ 267(郁闷的C小加(二)) 后缀表达式求值
- NYOJ-267 郁闷的C小加(二)
- NYOJ 35 表达式求值 or 267 郁闷的C小加(二)
- NYOJ 267 郁闷的C小加(二)
- NYOJ 267郁闷的C小加(二)
- NYOJ 267 郁闷的C小加(二)
- 南阳oj 郁闷的c小加(二) 题目267
- NYOJ 257 郁闷的C小加(一)
- nyoj_257 郁闷的c小加
- NYOJ XYNUYOJ 郁闷的c小加(一)(数据结构)
- NYOJ 257 郁闷的C小加(一)
- nyoj 409——郁闷的C小加(三)——————【中缀式化前缀后缀并求值】
- NYOJ 257 郁闷的C小加(一)
- NYOJ 409 郁闷的C小加(三)