zoukankan      html  css  js  c++  java
  • nyoj267 郁闷的C小加(二)

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #define N 1010
      4 char s[N];
      5 int i;
      6 //字符栈的操作 
      7 typedef struct
      8 {
      9   char *base;
     10   char *top;
     11 }SqStack1;
     12 int InitStack1(SqStack1 &S)
     13 {
     14   S.base=(char *)malloc(N*sizeof(char));
     15   if(!S.base)  exit(1);
     16   S.top=S.base;
     17   return 1;
     18 }
     19 int StackEmpty1(SqStack1 &S)
     20 {
     21   if(S.top==S.base)
     22       return 1;
     23   return 0;
     24 }
     25 char GetTop1(SqStack1 S)
     26 {
     27     char e; 
     28     if(S.top==S.base)  return 0;
     29     e=*(S.top-1);
     30     return e;
     31 }
     32 int Push1(SqStack1 &S,char e)
     33 {
     34   *S.top++=e;
     35   return 1;
     36 }
     37 int Pop1(SqStack1 &S,char &e)
     38 {
     39   if(S.top==S.base)  return 0;
     40   e=*--S.top;
     41   return 1;
     42 }
     43 //数字栈的操作
     44 typedef struct
     45 {
     46   float *base;
     47   float *top;
     48 }SqStack2;
     49 int InitStack2(SqStack2 &S)
     50 {
     51   S.base=(float *)malloc(N/2*sizeof(float));
     52   if(!S.base)  exit(1);
     53   S.top=S.base;
     54   return 1;
     55 }
     56 int StackEmpty2(SqStack2 &S)
     57 {
     58   if(S.top==S.base)
     59   return 1;
     60   else return -1;
     61 }
     62 float GetTop2(SqStack2 S)
     63 {
     64     float e;
     65     if(S.top==S.base)  return 0;
     66     e=*(S.top-1);
     67     return e;
     68 }
     69 int Push2(SqStack2 &S,float e)
     70 {
     71   *S.top++=e;
     72   return 1;
     73 }
     74 int Pop2(SqStack2 &S,float &e)
     75 {
     76   if(S.top==S.base) return 0;
     77   e=*--S.top;
     78   return 1;
     79 }
     80 //转化的操作过程 
     81 float Operate(float a,char theta,float b)
     82 {
     83     switch(theta){
     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 k)
     92 {
     93     switch(c){
     94         case '=': return 1;
     95         case ')': return k?2:5;
     96         case '+':
     97         case '-': return 3;
     98         case '*':
     99         case '/': return 4;
    100         case '(': return k?5:2;
    101         case ' ': return 6;
    102         default : return 0;
    103     }
    104 }
    105 int Precede(char c1,char c2)
    106 {
    107     if(level(c1,0)<level(c2,1)||c1=='='&&c2=='=') return 0;
    108     return 1;
    109 }
    110 int Converse(char *s)
    111 {
    112     SqStack1 OPTR;
    113     char ch,x,c=getchar();
    114     InitStack1(OPTR);
    115     Push1(OPTR,'=');
    116     while(!StackEmpty1(OPTR)){
    117         if(!level(c,1))
    118             s[i++]=c;
    119         else
    120         switch(c){
    121             case '(': Push1(OPTR,c);break;
    122             case ')': Pop1(OPTR,ch);while(ch!='('){s[i++]=ch;Pop1(OPTR,ch);}break;
    123             default : ch=GetTop1(OPTR);
    124                       while(Precede(ch,c)){
    125                           s[i++]=ch;
    126                           Pop1(OPTR,ch);
    127                           ch=GetTop1(OPTR);
    128                       }
    129                       if(c!='=')
    130                       Push1(OPTR,c);
    131                       break;
    132         }
    133         if(c!='='){
    134             x=c;
    135             c=getchar();
    136             if(!level(x,1)&&level(c,1))
    137                 s[i++]=' ';
    138         }
    139         else{
    140             Pop1(OPTR,ch);
    141             s[i++]=ch;
    142         }
    143     }
    144     s[i]='\0';
    145     return 1;
    146 }
    147 float EvaluateExpression()
    148 {
    149     SqStack2 OPND;
    150     InitStack2(OPND);
    151     float k,t; 
    152     char *p1,*p=s;
    153     char c=*p;
    154     while(c!='='){
    155         for(t=k=0;!level(c,1)&&c!='.';c=*++p)
    156             k=10*k+c-'0';
    157         if(c=='.'){
    158             while(level(*++p,1)!=6);
    159             c=*p;
    160             for(p1=p-1;*p1!='.';p1--)
    161                 t=0.1*t+*p1-'0';
    162             t*=0.1;
    163         }    
    164         Push2(OPND,k+t);
    165         c=*++p;
    166         while(level(c,1)==3||level(c,1)==4){
    167             Pop2(OPND,k); 
    168             Pop2(OPND,t);
    169             Push2(OPND,Operate(t,c,k));
    170             c=*++p;
    171         }
    172     }
    173     return GetTop2(OPND);
    174 }
    175 //主函数
    176 int main()
    177 {
    178     int j,n;
    179     scanf("%d",&n);
    180     while(n--){
    181         getchar();
    182         i=0;
    183         Converse(s);
    184         for(j=0;s[j];++j){
    185             if(s[j]==' ') continue;
    186             putchar(s[j]);
    187         }
    188         printf("\n%.2f\n",EvaluateExpression());
    189         if(n) putchar('\n');
    190     }
    191     return 0;
    192 }
  • 相关阅读:
    linux下vim的安装及其设置细节
    vm虚拟机下ubuntu连接上ssr
    文件写入-结构体排序
    利用链表进行报数游戏
    链表——尾插法
    C#设计模式总结
    C#设计模式(20)——策略者模式(Stragety Pattern)
    Autofac在项目中应用的体会,一个接口多个实现的情况
    C#设计模式(1)——单例模式
    jquery.js与sea.js综合使用
  • 原文地址:https://www.cnblogs.com/shihuajie/p/2619287.html
Copyright © 2011-2022 走看看