zoukankan      html  css  js  c++  java
  • 数据结构03 栈的后缀表达式实现

    首先要构造栈,目的是将操作符存入栈中。

    有三种情况,优先级一样,优先级比栈顶的高,优先级比栈顶的低。

    优先级比栈顶的低或一样,则栈顶的输出,出栈,再将此运算符进栈。

    优先级比栈顶的高,则入栈。

    ‘( ’优先级最高 ,入栈。‘)’不入栈。栈内一直出栈直到‘( ’。

    最后直接输出栈内所有元素。

    最终输出后缀表达式。

    将这个表达式存入另一个栈。这时实现了逆序存储。然后从栈顶遍历,遇到数字存入新的栈,遇到操作符,实用switch实现运算。出栈两次,进栈一次。进栈的为运算结果。最终输出栈顶元素。栈只剩下一个元素。

     

      1 #include <stdio.h>
      2 #include <cstdlib>
      3 #include <string.h>
      4 #define STACK_INIT_SIZE 100
      5 #define STACKINCREMENT 10
      6 
      7 typedef struct {
      8   int *base;
      9   int *top;
     10   int stacksize;
     11 }SqStack;
     12 
     13 int Init(SqStack &S)
     14 {
     15   S.base = (int *)malloc(STACK_INIT_SIZE *sizeof(int));
     16   if (!S.base) return 0;
     17   S.top = S.base;
     18   S.stacksize = STACK_INIT_SIZE;
     19   return 1;
     20 }//Init
     21 
     22 int Push(SqStack &S,int e)
     23 {
     24   if(S.top - S.base >= S.stacksize){
     25     S.base = (int *)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof(int));
     26     if(!S.base) return 0;
     27     S.top = S.base + S.stacksize;
     28     S.stacksize += STACKINCREMENT;
     29   }//if
     30   *S.top = e;
     31   S.top++;
     32   return 1;
     33 }//Push
     34 
     35 int Pop(SqStack &S)
     36 {
     37   if (S.top == S.base) return 0;
     38   --S.top;
     39   return 1;
     40 }
     41 
     42 int getTop(SqStack S)
     43 {
     44   return *(S.top - 1);
     45 }
     46 
     47 int main()
     48 {
     49   SqStack S,M,N,P;
     50   Init(S);
     51   Init(M);
     52   Init(N);
     53   Init(P);
     54   char s[100];
     55   int i;
     56   gets(s);
     57   for(i = 0;i < strlen(s);i++)
     58   {
     59       switch(s[i])
     60       {
     61           case '+':
     62       //加法优先级最低
     63       {
     64         if(getTop(S) == '*' || getTop(S) == '/' || getTop(S) == '+' || getTop(S) == '-')
     65         {
     66           printf("%c",getTop(S));
     67               Push(M,getTop(S));
     68           Pop(S);
     69           Push(S,'+');
     70         }
     71 
     72         else
     73           Push(S,'+');
     74       }
     75       break;
     76           case '-':
     77       //减法和加法类似
     78       {
     79         if(getTop(S) == '*' || getTop(S) == '/' || getTop(S) == '+' || getTop(S) == '-')
     80         {
     81           printf("%c",getTop(S));
     82               Push(M,getTop(S));
     83           Pop(S);
     84           Push(S,'-');
     85         }
     86         else
     87           Push(S,'-');
     88       }
     89       break;
     90           case '*':
     91       {
     92         if(getTop(S) == '*' || getTop(S) == '/')
     93         {
     94           printf("%c",getTop(S));
     95           Push(M,getTop(S));
     96           Pop(S);
     97           Push(S,'*');
     98         }
     99         else
    100           {
    101             Push(S,'*');
    102           }
    103       }//case
    104       break;
    105           case '/':
    106         {
    107             if(getTop(S) == '*' || getTop(S) == '/')
    108              {
    109                printf("%c",getTop(S));
    110                Push(M,getTop(S));
    111                Pop(S);
    112                Push(S,'/');
    113              }
    114              else
    115                {
    116                  Push(S,'/');
    117                }
    118         }//case
    119       break;
    120       case '(':
    121         Push(S,'(');
    122       break;
    123       case ')':
    124       {
    125         while (getTop(S) != '(')
    126         {
    127           printf("%c",getTop(S));
    128               Push(M,getTop(S));
    129           Pop(S);
    130         }
    131         Pop(S);
    132       }
    133       break;
    134           default:
    135               {
    136                   printf("%c",s[i]);
    137                   Push(M,s[i]);
    138               }
    139         }//switch
    140   }//for
    141 while(S.base != S.top)
    142 {
    143   printf("%c",*(S.top - 1));
    144   Push(M,*(S.top - 1));
    145   Pop(S);
    146 }
    147 printf("
    ");
    148 // printf("%c
    ",*(M.top - 1));
    149     while(M.base != M.top)
    150     {
    151       Push(N,*(M.top-1));
    152       Pop(M);
    153     }//while
    154 
    155     int p = 0;
    156     while(N.base != N.top)
    157     {
    158         if(*(N.top - 1) != '+' && *(N.top - 1) != '-' && *(N.top - 1) != '*' && *(N.top - 1) != '/')
    159         {
    160       *(N.top - 1) = (int)*(N.top - 1) - 48;
    161             *P.top = *(N.top - 1);
    162       --N.top;
    163             ++P.top;
    164         }
    165 
    166         else
    167         {
    168       switch(*(N.top - 1))
    169             {
    170 
    171             case '+':
    172                 {
    173                     p = *(P.top - 2) + *(P.top - 1);
    174                     Pop(P);
    175                     Pop(P);
    176                     Push(P,p);
    177                 }
    178                 break;
    179             case '-':
    180                 {
    181                     p = *(P.top - 2) - *(P.top - 1);
    182                     Pop(P);
    183                     Pop(P);
    184                     Push(P,p);
    185                 }
    186                 break;
    187             case '*':
    188                 {
    189                     p = *(P.top - 2) * *(P.top - 1);
    190                     Pop(P);
    191                     Pop(P);
    192                     Push(P,p);
    193                 }
    194                 break;
    195             case '/':
    196                 {
    197                     p = *(P.top - 2) / *(P.top - 1);
    198                     Pop(P);
    199                     Pop(P);
    200                     Push(P,p);
    201                 }
    202                 break;
    203             }//switch
    204             --N.top;
    205         }//else
    206 
    207     }//while
    208   printf("表达式结果为:");
    209   printf("%d
    ",*P.base);
    210     return 0;
    211 
    212 }//main
    stack.h

     

    小钻风,大三狗。 金融和计算机。
  • 相关阅读:
    CUP的MESI协议
    synchronized 锁的升级
    BigDecimal/Long 前后端交互失去精度解决办法
    nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
    根据文件原始名称,文件根路径按照日期生成存储路径
    异步处理MultipartFile -- No such file or directory
    select下拉框相关操作(更新中。。。)
    input清空和重置select下拉框
    sql多字段分组排序显示全部数据
    ajax发送请求下载字节流形式的excel文件
  • 原文地址:https://www.cnblogs.com/jiawei666/p/7763262.html
Copyright © 2011-2022 走看看