zoukankan      html  css  js  c++  java
  • 栈与队列应用:逆波兰计算器(逆波兰表达式;后缀表达式)把运算符放到运算量后边 && 中缀表达式转化为后缀表达式

      1 //1.实现对逆波兰输入的表达式进行计算如(2-1)*(2+3)= 5  就输入2 1 - 2 3 + *   //先把2 1 压栈 遇到-弹栈 再把2 3压进去 遇到+弹栈 最后遇到*弹栈
      2 //2.支持带小数点的数据
      3 例: 正常操作----->逆波兰表达式
      4      a+b   ------>a b +
      5      a+(b-c)----->a b c - +
      6      a+(b-c)*d--->a b c - d * +
      7      a+d*(b-c)--->a d b c - * +
      8 
      9 //2 5 + 4 2 - *  == (2+5)*(4-2) == 14
     10 //1 34 + 4 2 / * ==(1+34)*(4/2)== 70 
     11 #include<stdio.h>
     12 #include<stdlib.h>
     13 #include<ctype.h>  //函数isdigit  检查是否为十进制数 
     14 
     15 #define MAXSIZE 100
     16 #define MAXBUFFER 10 //缓冲区 
     17 
     18 typedef double ElemType;  
     19 
     20 typedef struct
     21 {
     22     ElemType *base;
     23     ElemType *top;
     24     int sizeStack;
     25 }sqStack;
     26 
     27 void InitStack(sqStack *s)
     28 {
     29     s->base = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
     30     if(!s->base)
     31     {
     32         exit(0);
     33     }
     34     s->top = s->base;
     35     s->sizeStack = MAXSIZE;
     36 }
     37 
     38 void Push(sqStack *s,ElemType e)
     39 {
     40     if(s->top - s->base == s->sizeStack)
     41     {
     42         exit(0);
     43     }
     44     *(s->top) = e;
     45     s->top++;
     46 }
     47 
     48 void Pop(sqStack *s,ElemType *e)
     49 {
     50     if(s->top == s->base)
     51     {
     52         return;
     53     }
     54     *e = *(--(s->top));
     55 }
     56  
     57 int main(void)
     58 {
     59     sqStack s;
     60     char c;
     61     char str[MAXBUFFER];
     62     double d,e;
     63     int i = 0;
     64     
     65     InitStack(&s);
     66     printf("请输入后缀表达式的字符,运算符与数字用空格隔开\n");
     67     scanf("%c",&c);
     68     while(c != '#')
     69     {
     70         while(isdigit(c) || c=='.')  //判断是否遇到数字
     71         {
     72             str[i++] = c;
     73             str[i] = '\0';
     74             if(i >= 10)
     75             {
     76                 printf("单个数字太大啊"); 
     77                 return -1;
     78             }
     79             scanf("%c",&c);
     80             if(c == ' ')
     81             {
     82                 d = atof(str);  //将字符串转换成浮点型  存在<stdlib.h>
     83                 Push(&s,d);
     84                 i = 0;
     85                 break; 
     86             }
     87         }
     88 
     89         switch(c) //判断是否遇到运算符
     90         {
     91             case '+':
     92                 Pop(&s,&e);
     93                 Pop(&s,&d);
     94                 Push(&s,d+e);
     95                 break;
     96             case '-':
     97                 Pop(&s,&e);
     98                 Pop(&s,&d);
     99                 Push(&s,d-e);
    100                 break;
    101             case '*':
    102                 Pop(&s,&e);
    103                 Pop(&s,&d);
    104                 Push(&s,d*e);
    105                 break;
    106             case '/':
    107                 Pop(&s,&e);
    108                 Pop(&s,&d);
    109                 if(e != 0)
    110                 {
    111                     Push(&s,d/e);
    112                 }
    113                 else
    114                 {
    115                     printf("被除数不能为0!\n");
    116                     return -1;
    117                 }
    118                 break;
    119         }
    120         scanf("%c",&c);
    121     }
    122     Pop(&s,&d);
    123     printf("最终结果为:%f",d);
    124     return 0;
    125 }
    126 
    127 
    128 
    129 //将中缀表达式转化为后缀表达式
    130 #include<stdio.h>
    131 #include<stdlib.h>
    132 
    133 #define MAXSIZE 20
    134 #define INCREMENTSIZE 10
    135 
    136 typedef char ElemType; 
    137 typedef char ElemType2;
    138 typedef struct 
    139 {
    140     ElemType *base;
    141     ElemType *top;
    142     int StackSize;
    143 }sqStack;
    144 
    145 void InitStack(sqStack *s)
    146 {
    147     s->base = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
    148     if(!s->base)
    149     {
    150         printf("内存分配失败!\n");
    151         exit(0);
    152     }
    153     s->top = s->base;
    154     s->StackSize = MAXSIZE;
    155 } 
    156 
    157 void Push(sqStack *s, ElemType e)
    158 {
    159     if(s->top - s->base == s->StackSize)
    160     {
    161         s->base = (ElemType *)realloc(s->base,(s->StackSize+INCREMENTSIZE)*sizeof(ElemType));
    162         if(!s->base)
    163         {
    164             printf("重新分配内存失败!\n");
    165             exit(0); 
    166         }
    167         s->top=s->base+s->StackSize;
    168         s->StackSize=s->StackSize+INCREMENTSIZE;
    169     }
    170     *(s->top) = e;
    171     s->top++;
    172 }
    173 
    174 void Pop(sqStack *s,ElemType *e)
    175 {
    176     if(s->top == s->base)
    177     {
    178         return;
    179     }
    180     *e = *(--(s->top));
    181 }
    182 
    183 int StackLen(sqStack s)
    184 {
    185     return (s.top - s.base);
    186 }
    187 
    188 int main(void)
    189 {
    190     sqStack s;
    191     char c,e;
    192     
    193     InitStack(&s);
    194     printf("请输入中缀表达式\n");
    195     scanf("%c",&c);
    196     while(c !='#')
    197     {
    198         
    199         while(c>='0' && c<='9')
    200         {
    201             printf("%c",c);
    202             scanf("%c",&c);
    203             if(c<'0' || c>'9')
    204             {
    205                 printf(" ");
    206             }
    207         }
    208         
    209         if(c==')')
    210         {
    211             Pop(&s,&e);
    212             while(e != '(')
    213             {
    214                 printf("%c ",e);
    215                 Pop(&s,&e);
    216             }
    217         }
    218         else if(c=='+' || c=='-')
    219         {
    220             if(!StackLen(s))
    221             {
    222                 Push(&s,c);
    223             }
    224             else
    225             {
    226                 do
    227                 {
    228                     Pop(&s,&e);
    229                     if(e == '(')
    230                     {
    231                         Push(&s,e); //遇到左括号就弹走就ok 
    232                     }
    233                     else
    234                     {
    235                         printf("%c ",e);
    236                     }
    237                     
    238                 }while(StackLen(s) && e!='(');
    239                 Push(&s,c);
    240             }
    241         }
    242         else if(c=='/' || c=='*' || c=='(')
    243         {
    244             Push(&s,c);
    245         }
    246         else if(c == '#')
    247         {
    248             break;
    249         }
    250         else 
    251         {
    252             printf("数据输入错误啊!\n");
    253             return -1;
    254         }
    255         scanf("%c",&c);
    256     }
    257     while(StackLen(s))
    258     {
    259         Pop(&s,&e);
    260         printf("%c ",e);
    261     }
    262     return 0;
    263 }
  • 相关阅读:
    pku 1330 LCA
    最近公共祖先(LCA)的Tarjan算法
    字典数模板
    字典树
    RMQ问题ST算法与模板
    RMQ(Range Minimum/Maximum Query)问题:
    罗穗骞的dc3和倍增法
    多重背包问题
    tarjan LCA 算法
    终极工程师的造诣 – 不迷信高科技的乔布斯给我们的启示
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12491315.html
Copyright © 2011-2022 走看看