NYOJ 128 前缀式计算

 1 #include<stdio.h>

 2 #include<string.h>

 3 #include<stdlib.h>

 4 #define N 501

 5 char a[N];

 6 double fun()

 7 {

 8     int len;

 9     char ch[10];

10     sscanf(a,"%s",ch);//以字符串读入到ch

11     len=strlen(ch);

12     strcpy(a,a+len);

13     switch(ch[0])

14     {

15         case '+': return fun()+fun();

16         case '-': return fun()-fun();

17         case '*': return fun()*fun();

18         case '/': return fun()/fun();

19         default : return (double)(ch);//把字符串转换成浮点数

20     }

21 }

22 int main()

23 {

24     double m;

25     while(gets(a))

26     {

27         m=fun();

28         printf("%.2lf\n",m);

29     }

30     system("pause");

31     return 0;

32 }
  1 #include<stdio.h>

  2 #include<string.h>

  3 #include<stdlib.h>

  4 #define N 1100

  5 char s[N];

  6 //数字栈的操作

  7 typedef struct

  8 {

  9   float *base;

 10   float *top;

 11 }SqStack2;

 12 int InitStack2(SqStack2 &S)

 13 {

 14   S.base=(float *)malloc(505*sizeof(float));

 15   S.top=S.base;

 16   return 1;

 17 }

 18 int StackEmpty2(SqStack2 &S)

 19 {

 20   if(S.top==S.base)

 21   return 1;

 22   else return -1;

 23 }

 24 float GetTop2(SqStack2 S)

 25 {

 26     float e;

 27     if(S.top==S.base)  return 0;

 28     e=*(S.top-1);

 29     return e;

 30 }

 31 int Push2(SqStack2 &S,float e)

 32 {

 33   *S.top++=e;

 34   return 1;

 35 }

 36 int Pop2(SqStack2 &S,float &e)

 37 {

 38   if(S.top==S.base) return 0;

 39   e=*--S.top;

 40   return 1;

 41 }

 42 //转化的操作过程 

 43 float Operate(float a,char theta,float b)

 44 {

 45     switch(theta){

 46         case '+': return a+b;

 47         case '-': return a-b;

 48         case '*': return a*b;

 49         case '/': return a/b;

 50         default: return 0;

 51     }

 52 }

 53 int level(char c)

 54 {

 55     switch(c){

 56         case ' ': return 1;

 57         case '+':

 58         case '-': return 3;

 59         case '*':

 60         case '/': return 4;

 61         default : return 0;

 62     }

 63 }

 64 float EvaluateExpression()

 65 {

 66     SqStack2 OPND;

 67     InitStack2(OPND);

 68     bool flag;

 69     float k,t; 

 70     char *p=s+strlen(s)-1;

 71     char c=*p;

 72     while(p!=s){

 73         flag=0;

 74         if(!level(c)){

 75             k=c-'0';

 76             c=*--p;

 77             flag=1;

 78         }

 79         if(c!=' '){

 80             for(t=k;*p<='9'&&*p>='0';p--)

 81                 t=0.1*t+*p-'0';

 82             t*=0.1;

 83             c=*--p;

 84             k=c-'0';

 85             Push2(OPND,k+t);

 86             p--;

 87         }

 88         else if(flag) Push2(OPND,k);

 89         if(p>s) c=*--p;

 90         while(level(c)==3||level(c)==4){

 91             Pop2(OPND,k);

 92             Pop2(OPND,t);

 93             Push2(OPND,Operate(k,c,t));

 94             if(p<=s) break;

 95             c=*--p;

 96         }

 97     }

 98     return GetTop2(OPND);

 99 }

100 //主函数

101 int main()

102 {

103     while(gets(s)){

104         printf("%.2f\n",EvaluateExpression());

105     }

106     return 0;

107 }

108         
 
   

 

 
  

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