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 }

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

你可能感兴趣的:(计算)