算术表达式的转换

算术表达式的转换
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
输入
输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
输出
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
+*ab*-c/def
a*b+c-d/e*f

ab*cde/-f*+

参考博文:http://blog.youkuaiyun.com/antineutrino/article/details/6763722

感悟:STL确实挺方便.

/*
思路:将表达式分为3类::操作符,括号,字母.定义操作符的优先级
*/
# include <bits/stdc++.h>
using namespace std;
bool isoperator(char c);
int priority(char c);
void prefix_expression();
void postfix_expression();
char s[1000];
int main()
{
    int i;
    gets(s);
    prefix_expression();
    for(i=0;s[i]!='#';i++)
    {
        if(s[i]!='(' && s[i]!=')')
            cout<<s[i];
    }
    cout<<endl;
    postfix_expression();
    return 0;
}
bool isoperator(char c)
{
    return (c == '+' || c == '-' || c == '*' || c == '/');
}
int priority(char c)
{
    if(c == '+' || c == '-')
    {
        return 1;
    }
    if(c == '*' || c == '/')
    {
        return 2;
    }
}
void prefix_expression()
{
    int i;
    stack<char>S1;//运算符栈S1;
    stack<char>S2;//和储存中间结果的栈S2
    for(i=strlen(s)-1;i>=0;i--)
    {
        if('a'<=s[i] && s[i]<='z')
            S2.push(s[i]);
        else
        {
            if(isoperator(s[i]))
            {
                if(S1.empty() || S1.top() == ')')
                    S1.push(s[i]);
                else
               {
                   if( priority(s[i]) >= priority(S1.top()) ) //注意求前缀表达式的操作符优先级判定
                       S1.push(s[i]);
                    else
                   {
                        S2.push(S1.top());
                        S1.pop();
                        S1.push(s[i]);
                    }
                }
            }
            else
            {
                if(s[i] == ')')
                    S1.push(s[i]);
                if(s[i] == '(')
                {
                    while(S1.top()!=')')
                    {
                        S2.push(S1.top());
                        S1.pop();
                    }
                    S1.pop();
                }
            }
        }

    }
    while(!S1.empty())
    {
        S2.push(S1.top());
        S1.pop();
    }
    while(!S2.empty())
    {
        cout<<S2.top();
        S2.pop();
    }
    cout<<endl;
}

void postfix_expression()
{
    int i;
    stack<char>S;
    for(i=0;i<strlen(s)-1;i++)
    {
        if('a'<=s[i] && s[i]<='z' || 'A'<=s[i] && s[i] <='Z')
            cout<<s[i];
        else
        {
            if(isoperator(s[i]))
            {
                if(S.empty() || S.top() == '(')
                    S.push(s[i]);
                else
                {
                    if(priority(s[i]) > priority(S.top()))//注意求后缀的优先级判定条件
                        S.push(s[i]);
                    else
                    {
                        cout<<S.top();
                        S.pop();
                        S.push(s[i]);
                    }
                }
            }
            else
            {
                if(s[i]=='(')
                    S.push(s[i]);
                if(s[i]==')')
                {
                    while(S.top()!='(')
                    {
                        cout<<S.top();
                        S.pop();
                    }
                    S.pop();
                }
            }
        }
    }
    while(!S.empty())
    {
        cout<<S.top();
        S.pop();
    }
    cout<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值