nyoj128 前缀式计算

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #define N 1010
  5 char s[N];
  6 //数字栈的操作
  7 typedef struct
  8 {
  9   float *base;
 10   float *top;
 11 }SqStack;
 12 int InitStack(SqStack &S)
 13 {
 14   S.base=(float *)malloc(N/2*sizeof(float));
 15   S.top=S.base;
 16   return 1;
 17 }
 18 float GetTop(SqStack S)
 19 {
 20     float e;
 21     if(S.top==S.base)  return 0;
 22     e=*(S.top-1);
 23     return e;
 24 }
 25 int Push(SqStack &S,float e)
 26 {
 27   *S.top++=e;
 28   return 1;
 29 }
 30 int Pop(SqStack &S,float &e)
 31 {
 32   if(S.top==S.base) return 0;
 33   e=*--S.top;
 34   return 1;
 35 }
 36 //转化的操作过程 
 37 float Operate(float a,char theta,float b)
 38 {
 39     switch(theta){
 40         case '+': return a+b;
 41         case '-': return a-b;
 42         case '*': return a*b;
 43         case '/': return a/b;
 44         default: return 0;
 45     }
 46 }
 47 int level(char c)
 48 {
 49     switch(c){
 50         case ' ': return 1;
 51         case '+':
 52         case '-': return 3;
 53         case '*':
 54         case '/': return 4;
 55         default : return 0;
 56     }
 57 }
 58 float EvaluateExpression()
 59 {
 60     SqStack OPND;
 61     InitStack(OPND);
 62     bool flag;
 63     float k,t; 
 64     char *p=s+strlen(s)-1;
 65     char c=*p;
 66     while(p!=s){
 67         flag=0;
 68         if(!level(c)){
 69             k=c-'0';
 70             c=*--p;
 71             flag=1;
 72         }
 73         if(c!=' '){
 74             for(t=k;*p!='.';p--)
 75                 t=0.1*t+*p-'0';
 76             t*=0.1;
 77             c=*--p;
 78             k=c-'0';
 79             Push(OPND,k+t);
 80             p--;
 81         }
 82         else if(flag) Push(OPND,k);
 83         c=*--p;
 84         while(level(c)==3||level(c)==4){
 85             Pop(OPND,k);
 86             Pop(OPND,t);
 87             Push(OPND,Operate(k,c,t));
 88             if(p==s) break;
 89             c=*--p;
 90         }
 91     }
 92     return GetTop(OPND);
 93 }
 94 //主函数
 95 int main()
 96 {
 97     while(gets(s))
 98         printf("%.2f\n",EvaluateExpression());
 99     return 0;
100 }

本题我利用了前缀式倒过来恰好是后缀式的形式,然后就可用一个数字栈进行处理了,但把字符串倒置过来的同时,数字特别是小数也倒置过来了,所以我把时间花在了处理一个颠倒数字上!!

posted on 2012-08-02 10:14  小花熊  阅读(199)  评论(0编辑  收藏  举报

导航