中缀表达式转后缀表达式

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

中缀表达式转后缀表达式


中缀表达式a + b*c + (d * e + f) *g,其转换成后缀表达式则为a b c * + d e * f  + g * +。
转换过程需要用到栈,具体过程如下:
1)如果遇到操作数,我们就直接将其输出。
2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。
3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。
4)如果遇到任何其他的操作符,如(“+”,“*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到") "的情况下我们才弹出" ( ",其他情况我们都不会弹出" ( "。当然按照优先级数组来说也是很正常的。
5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
#include
#include
#include
using namespace std;
bool Decide(char c);
char Precede(char a,char b);
char SwitchPrecede(stack &tempS,char&c);
int main()
{
   cout<<"the end of your input shouldbe '#'"<<endl;
    stacktempS;//临时存放操作符
    char c;
    int temp = 0;
    c = getchar();
    tempS.push('#');
    while(true)
    {
        if(temp!=0)
       {
          cout<<temp;
          temp=0;
       }
       if(Decide(c))
       {
          if(c==')')
           {
              while(tempS.top()!='(')
              {
                cout<<tempS.top();
                 tempS.pop();
              }
              tempS.pop();//去除左括号
              c=getchar();
              continue;

           }
          if(tempS.top()=='#')
           {
              tempS.push(c);
           }
           elseif(c!='#')
           {
              SwitchPrecede(tempS,c);
           }
       }
       elseif(c>='0'&&c<='9')
       {
           temp =temp*10+c-'0';
       }
       if(c=='#')
       {
          while(tempS.top()!='#')
           {
             cout<<tempS.top();
              tempS.pop();
           }
          break;
       }
       c = getchar();
    }

    return 0;
}
bool Decide(char c)
{
 if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
    return true;
 else
    return false;
}
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]];
}
char SwitchPrecede(stack &tempS,char&c)
{
   switch(Precede(tempS.top(),c))
    {
       case '>':
       case '=':
          cout<<tempS.top();
          tempS.pop();
          SwitchPrecede(tempS,c);//递归
          break;
       case '<':
          tempS.push(c);
          break;
    }
}


0 0
原创粉丝点击