中缀表达式转后缀表达式


中缀表达式转后缀表达式


中缀表达式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 should be '#'"<<endl;
    stack tempS;//临时存放操作符
    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);
            }
            else if(c!='#')
            {
                SwitchPrecede(tempS,c);
            }
        }
        else if(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(int i=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;
        }
    }
    return table[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;
    }
}


你可能感兴趣的:(中缀表达式转后缀表达式)