栈的应用:求中缀表达式的值。

来源:互联网 发布:网络实名制利大于弊 编辑:程序博客网 时间:2024/05/22 10:26

栈的应用:求中缀表达式的值。

     数据结构实训,数据结构课本上关于这个有一个标准伪码,没看过。

     这个算法以前做题的时候遇到过,这次测试的时候很幸运的发现了在之前实现过程中一个没有理解到位的地方,比如遇到某个符号,符号栈中的符号满足可以进行运算处理的要求,这个时候不是处理一次,而是一直要处理到符号栈不满足要求为止。这样最终处理结果符号栈中最多剩下两个符号,再依次处理即可。

     细节+代码如下:

     

#include<stdio.h>#include<string.h>   #include<stdlib.h>   #define STACK_INIT_SIZE 100     #define STACKINCREMENT 10   int n,n1,n2;typedef struct express{     int num;      char op;  }express;  typedef struct sqstack{ //栈的结构。    express *base;       express *top;        int stacksize;    }sqstack;    int initstack(sqstack *S){ //构建一个栈。      S->base = (express *)malloc(STACK_INIT_SIZE*sizeof(express));        S->top = (express *)malloc(STACK_INIT_SIZE*sizeof(express));        if(!S->base||!S->top)            return -1;        S->top = S->base;        S->stacksize = STACK_INIT_SIZE;        return 1;    }    int pushchar(sqstack *S,char e){ //字符栈的入栈函数。    if(S->top-S->base>=S->stacksize){            S->base = (express *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(express));            if(!S->base)                return 0;            S->top = S->base+S->stacksize;            S->stacksize = S->stacksize+STACKINCREMENT;    }           (S->top)->op= e;     S->top++;            return 1;    }    int pushint(sqstack *S,int e){ //数字栈的入栈函数。       if(S->top-S->base>=S->stacksize){            S->base = (express *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(express));            if(!S->base)                return 0;            S->top = S->base+S->stacksize;            S->stacksize = S->stacksize+STACKINCREMENT;    }           (S->top)->num= e;        S->top++;        return 1;    }  int popchar(sqstack *S,char *g){ //字符栈的出栈函数。        if(S->top==S->base)            return -1;        S->top--;        *g = S->top->op;       return 0;    }    int popint(sqstack *S,int  *g){ //数字栈的出栈函数。        if(S->top==S->base)            return -1;        S->top--;        *g = (S->top)->num;       return 0;    }      int count(int k1,int k2,char t){ //运算操作函数。      int enter;      if(t=='+')          enter = k1+k2;      if(t=='-')          enter = k2-k1;      if(t=='*')          enter = k1*k2;      if(t=='/')          enter = k2/k1;      return enter;  }    int empty(sqstack *S,int n){ //判断栈在当前的空值定义下是否为空。      if(S->top - S->base==n)          return 0;      else          return 1;  }  int main(){      sqstack S1,S2;      char a[100],t;     int m,i,number,k1,k2,k3; n1 = 0;n2 = 0;    initstack(&S1);      initstack(&S2);      scanf("%s",a);      m = strlen(a)-1;      for(i = 0;i<=m;i++){          if(a[i]>='0'&&a[i]<='9'){ //遇到数字的处理。            number = a[i]-'0';              pushint(&S1,number); continue;        }          if(a[i]=='+'||a[i]=='-'){ //遇到"+"或"-"的处理。              if(empty(&S2,n2)==0){                  pushchar(&S2,a[i]);continue;            }              while(empty(&S2,n2)==1){                  popint(&S1,&k1);                  popint(&S1,&k2);                  popchar(&S2,&t);                  k3 = count(k1,k2,t);                  pushint(&S1,k3);  } pushchar(&S2,a[i]);        }          if(a[i]=='*'||a[i]=='/'){ //遇到"*"或"/"的处理。            if(empty(&S2,n2)==0){                  pushchar(&S2,a[i]);continue;            }  while(empty(&S2,n2)==1){popchar(&S2,&t);  if(t=='+'||t=='-'){  pushchar(&S2,t);break;}                  if(t=='*'||t=='/'){                      popint(&S1,&k1);                      popint(&S1,&k2);                      k3 = count(k1,k2,t);                      pushint(&S1,k3);  }  } pushchar(&S2,a[i]); }if(a[i]=='('){ //改变当前空值对应的取值。n1 = S1.top - S1.base;n2 = S2.top - S2.base;}if(a[i]==')'){ //对括号中剩余运算的处理。while(S1.top-S1.base>n1+1){popint(&S1,&k1);  popint(&S1,&k2);  popchar(&S2,&t);  k3 = count(k1,k2,t); pushint(&S1,k3);  }n1 = 0;n2 = 0;}    }while(S1.top-S1.base>1){ //对计算结果的最后运算处理。popint(&S1,&k1);  popint(&S1,&k2);          popchar(&S2,&t);          k3 = count(k1,k2,t);          pushint(&S1,k3);  }printf("%d\n",k3);    return 0;  }/* 测试案例: * *        输入: *             4*4+(2*2-3)-3 *        输出: *             14 */

0 0
原创粉丝点击