表达式求值(中缀)

来源:互联网 发布:初中语文软件哪个好 编辑:程序博客网 时间:2024/05/29 19:41

数据结构
P52
表达式求值(中缀)
#include
#include
#include
using namespace std;
char Precede(char a,char b);
int Operator(int a,char o,int b);
bool Decide(char c);
int main()
{
   cout<<"the end of your input shouldbe '#'"<<endl;
    stack operators;
    stack numbers;
   operators.push('#');
    char c;
    c=getchar();
    int temp=0;
   while(c!='#'||operators.top()!='#')
    {
      if(c>='0'&&c<='9')
       {
          temp=temp*10+c-'0';
          c=getchar();

       }
       else if(Decide(c))
       {
          if(temp!=0)
           {
              numbers.push(temp);
              temp=0;
           }
          switch(Precede(operators.top(),c))
           {
            case '<':
              operators.push(c);
              c=getchar();
              break;
            case '=':
               operators.pop();
               c=getchar();
               break;
            case '>':
                intb=numbers.top();//注意a、b的弹出顺序
               numbers.pop();
                charo=operators.top();
               operators.pop();
                inta=0;
               if(!numbers.empty())
                {
                   a=numbers.top();
                   numbers.pop();
                }
               numbers.push(Operator(a,o,b));
               break;
           }
       }
       else
          cout<<"your input contains errorchar!"<<endl;
    }
   cout<<"the result is"<<numbers.top()<<endl;
    return 0;
}
char Precede(char a,char b)
{
    int j[2];
    char table[7][7]=
    {
      {'>','>','<','<','<','>','>'},
      {'>','>','<','<','<','>','>'},
      {'>','>','>','>','<','>','>'},
      {'>','>','>','>','<','>','>'},
      {'<','<','<','<','<','=','e'},
      {'>','>','>','>','e','>','>'},
      {'<','<','<','<','<','e','='}
    };
    for(inti=0;i<2;i++)
    {
       char c;
       if(i==0)
       {
           c=a;
       }
       else if(i==1)
       {
           c=b;
       }
       switch(c)
       {
         case '+':j[i]=0;break;
         case '-':j[i]=1;break;
         case '*':j[i]=2;break;
         case '/':j[i]=3;break;
         case '(':j[i]=4;break;
         case ')':j[i]=5;break;
         case '#':j[i]=6;break;
       }
    }
    returntable[j[0]][j[1]];
}
int Operator(int a,char o,int b)
{
    switch(o)
    {
       case '+':return a+b;
       case '-':return a-b;
       case '*':return a*b;
       case '/':return a/b;
    }
}
bool Decide(char c)
{
 if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
    return true;
 else
    return false;
}

0 0
原创粉丝点击