中缀表达式转后缀表达式

对于考研而言,这种东西一般应该只会设计到+-*/()和正整数。
那么写起来就很好办了。

抄一下课本上的两个结论:

1.在扫描exp遇到一个运算符op时,如果栈为空,直接将其进栈, 如果栈不为空,只有当op的优先级高于栈顶运算符的优先级的时候才把op进栈, 否则依次出栈运算符并存入postexp,直到栈顶的运算符的优先级小于op的优先级为止, 然后再将op进栈。

2.在扫描exp时遇到(,那么直接入栈,如果遇到),那么不断出栈直至把一个(出栈。

代码:

#include
using namespace std;
stack sta;
bool isDigital(char c)
{
    if(c>='0'&&c<='9')return 1;
    return 0;
}
int main()
{
    freopen("in.txt","r",stdin);
    while(cin.peek()!='
'&&cin.peek()!=EOF)
    {
        char c=cin.peek();
        //处理数字 
        if(isDigital(c))
        {
            string str="";
            while(isDigital(c)||c=='.')
            {
                str+=c;
                cin.get();
                c=cin.peek();
            }
            cout<<str;
        }
        else
        {
            //处理+-*/()
            if(c=='(') cin.get(),sta.push(c);
            if(c==')') 
            {
                cin.get();
                while(sta.top()!='(')
                {
                    cout<<sta.top();
                    sta.pop();
                }
                sta.pop();
            }
            if(c=='+'||c=='-')
            {
                cin.get();
                while(sta.size()!=0&&sta.top()!='(')
                {
                    cout<<sta.top();
                    sta.pop();
                }
                sta.push(c);
            }
            if(c=='*'||c=='/')
            {
                cin.get();
                while(sta.top()=='*'||sta.top()=='/')
                {
                    cout<<sta.top();
                    sta.pop();
                }
                sta.push(c);
            }
        }
    }
    while(sta.size())
    {       
        cout<<sta.top();
        sta.pop();
    }
    return 0;
}

但是在acm里,就又多了正负数,小数。

#include
#include
#include
#include
using namespace std;
stack sta;
string str;
char c;
char last='1';
void solve()
{
    while(cin.peek()!='
')
    {
        c=cin.get();
        //cout<<"what"<<endl;
        //cout<<c<<endl;
        if(c>='0'&&c<='9')
        {
            str+=c;
            while((cin.peek()>='0'&&cin.peek()<='9')||cin.peek()=='.')
            {
                c=cin.get();
                str+=c;
            }
            str+=' ';
        }
        if(c=='+'||c=='-')
        {
            if(str.size()==0||(last=='+'||last=='-'||last=='*'||last=='/'||last=='('))
            {
                if(c!='+')
                str+=c;
            }
            else
            {
                if(!sta.empty()&&(sta.top()=='*'||sta.top()=='/'))
                {
                    while(!sta.empty()&&sta.top()!='(')
                    {
                        str+=sta.top();
                        str+=' ';
                        sta.pop();
                    }
                }
                sta.push(c);
            }   
        }
        if(c=='*'||c=='/')
        {
            sta.push(c);
        }
        if(c=='(')sta.push(c);
        if(c==')')
        {
            while(sta.top()!='(')
            {
                str+=sta.top();
                str+=' ';
                sta.pop();
            }
            sta.pop();
        }
        last=c;
    }
    while(!sta.empty())
    {
        str+=sta.top();
        str+=' ';
        sta.pop();
    }
}
void output()
{
    for(int i=0;i!=str.size()-1;i++)
    {
        cout<<str[i];
    }
    cout<<endl;
}
int main()
{   
    solve();
    output();
    return 0;
}
文章目录