zoukankan      html  css  js  c++  java
  • nyoj35 表达式求值

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #define N 1010
      4 char s[N];
      5 //字符栈的操作 
      6 typedef struct
      7 {
      8   char *base;
      9   char *top;
     10 }SqStack1;
     11 int InitStack1(SqStack1 &S)
     12 {
     13   S.base=(char *)malloc(N*sizeof(char));
     14   if(!S.base)  exit(1);
     15   S.top=S.base;
     16   return 1;
     17 }
     18 int StackEmpty1(SqStack1 &S)
     19 {
     20   if(S.top==S.base)
     21       return 1;
     22   return 0;
     23 }
     24 char GetTop1(SqStack1 S)
     25 {
     26     char e;
     27     if(S.top==S.base)  return 0;
     28     e=*(S.top-1);
     29     return e;
     30 }
     31 int Push1(SqStack1 &S,char e)
     32 {
     33   *S.top++=e;
     34   return 1;
     35 }
     36 int Pop1(SqStack1 &S,char &e)
     37 {
     38   if(S.top==S.base)  return 0;
     39   e=*--S.top;
     40   return 1;
     41 }
     42 //数字栈的操作
     43 typedef struct
     44 {
     45   float *base;
     46   float *top;
     47 }SqStack2;
     48 int InitStack2(SqStack2 &S)
     49 {
     50   S.base=(float *)malloc(N*sizeof(float));
     51   if(!S.base)  exit(1);
     52   S.top=S.base;
     53   return 1;
     54 }
     55 int StackEmpty2(SqStack2 &S)
     56 {
     57   if(S.top==S.base)
     58   return 1;
     59   else return -1;
     60 }
     61 float GetTop2(SqStack2 S)
     62 {
     63     float e;
     64     if(S.top==S.base)  return 0;
     65     e=*(S.top-1);
     66     return e;
     67 }
     68 int Push2(SqStack2 &S,float e)
     69 {
     70   *S.top++=e;
     71   return 1;
     72 }
     73 int Pop2(SqStack2 &S,float &e)
     74 {
     75   if(S.top==S.base)  return 0;
     76   e=*--S.top;
     77   return 1;
     78 }
     79 //转化的操作过程 
     80 float Operate(float a,char theta,float b)
     81 {
     82     switch(theta)
     83     {
     84         case '+': return a+b;
     85         case '-': return a-b;
     86         case '*': return a*b;
     87         case '/': return a/b;
     88         default: return 0;
     89     }
     90 }
     91 int level(char c,int i)
     92 {
     93     switch(c)
     94     {
     95         case '=': return 1;
     96         case ')': return i?2:5;
     97         case '+':
     98         case '-': return 3;
     99         case '*':
    100         case '/': return 4;
    101         case '(': return i?5:2;
    102         default : return 0;
    103     }
    104 }
    105 char Precede(char c1,char c2)
    106 {
    107     int k=(c1=='('&&c2=='=')||(c1=='='&&c2==')')||(c1==')'&&c2=='(');
    108     if(!k)
    109     {
    110         if(c1=='('&&c2==')') return '=';
    111         else 
    112         {
    113             if(level(c1,0)<level(c2,1)) return '<';
    114             else return '>';
    115         } 
    116     }
    117     return 0;
    118 } 
    119 float EvaluateExpression()
    120 {
    121     SqStack1 OPTR; SqStack2 OPND;
    122     char theta,c,x; float a,b,k,t; char *p1,*p=s;
    123     InitStack1(OPTR); Push1(OPTR,'=');
    124     InitStack2(OPND); c=*p;
    125     while(c!='='||GetTop1(OPTR)!='=')
    126     {
    127         if(!level(c,1))
    128         {
    129             for(t=k=0;!level(c,1)&&c!='.';c=*++p)
    130                 k=10*k+c-'0';
    131             if(c=='.')
    132             {
    133                 while(!level(*++p,1)); c=*p;
    134                 for(p1=p-1;*p1!='.';p1--)
    135                 t=0.1*t+*p1-'0';
    136                 t*=0.1;
    137             }
    138             Push2(OPND,k+t);
    139         }
    140         else
    141         switch(Precede(GetTop1(OPTR),c))
    142         {
    143             case'<': Push1(OPTR,c);c=*++p;break;
    144             case'=': Pop1(OPTR,x); c=*++p;break;
    145             case'>': 
    146                      Pop1(OPTR,theta);
    147                      Pop2(OPND,b); Pop2(OPND,a);
    148                      Push2(OPND,Operate(a,theta,b));
    149         }
    150     }
    151     return GetTop2(OPND);
    152 }
    153 //主函数 
    154 int main()
    155 {
    156     int n;
    157     scanf("%d%*c",&n);
    158     while(n--)
    159     {
    160         gets(s);
    161         printf("%.2f\n",EvaluateExpression());
    162     }
    163     return 0;
    164 }
  • 相关阅读:
    RSA算法
    本地CodeForces
    基于Giolite 多人开发
    DES算法
    MD5算法
    仓库库存管理系统(C+MySQL+ODBC)
    Spring源码解析(一)开篇
    JDK动态代理实现源码分析
    J.U.C Atomic(一)CAS原理
    JDK 注解详解
  • 原文地址:https://www.cnblogs.com/shihuajie/p/2619282.html
Copyright © 2011-2022 走看看