第六周项目5 后缀表达式

来源:互联网 发布:angrybots源码 编辑:程序博客网 时间:2024/06/05 05:03

点击打开链接

#include <stdio.h>  #include <stdlib.h>  #include "sqstack.h"  #define MaxOp 7    struct    {      char ch;        int pri;     }  lpri[]= {{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},  rpri[]= {{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};    int leftpri(char op)     {      int i;      for (i=0; i<MaxOp; i++)          if (lpri[i].ch==op)              return lpri[i].pri;  }    int rightpri(char op)   {      int i;      for (i=0; i<MaxOp; i++)          if (rpri[i].ch==op)              return rpri[i].pri;  }    bool InOp(char ch)       {      if (ch=='(' || ch==')' || ch=='+' || ch=='-'              || ch=='*' || ch=='/')          return true;      else          return false;  }    int Precede(char op1,char op2)   {      if (leftpri(op1)==rightpri(op2))          return 0;      else if (leftpri(op1)<rightpri(op2))          return -1;      else          return 1;  }  void trans(char *exp,char postexp[])    {      SqStack *opstack;                   int i=0;                     ElemType ch;      InitStack(opstack);        Push(opstack, '=');      while (*exp!='\0')           {          if (!InOp(*exp))                  {              while (*exp>='0' && *exp<='9')               {                  postexp[i++]=*exp;                  exp++;              }              postexp[i++]='#';             }          else    //为运算符的情况          {              GetTop(opstack, ch);               switch(Precede(ch ,*exp))              {              case -1:                            Push(opstack, *exp);                  exp++;                       break;              case 0:                          Pop(opstack, ch);                        exp++;                       break;              case 1:                              postexp[i++]=ch;                  Pop(opstack, ch);                  break;              }          }        } //while (*exp!='\0')      Pop(opstack, ch);      while (ch!='=')                {          postexp[i++]=ch;          Pop(opstack, ch);      }      postexp[i]='\0';         DestroyStack(opstack);  }    int main()  {      char exp[]="(56-20)/(4+2)";      char postexp[200];      trans(exp,postexp);      printf("中缀表达式:%s\n",exp);      printf("后缀表达式:%s\n",postexp);      return 0;  }  


0 0