算术表达式的转换

算术表达式的转换

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/ 
#include<bits/stdc++.h>
using namespace std;

char a[1000],b[1000],c[1000];
int youxian(char a)
{
        if(a=='+'||a=='-')
            return 1;
        if(a=='*'||a=='/')
            return 2;
        if(a=='(')
            return 3;
        if(a==')')
            return 4;
}
void solve_pre(char b[])//求前缀式
{
    stack <char >sp;
    int i=0;
    int k=0;
    while(b[i]!='#')
    {
        if(b[i]>='a'&&b[i]<='z')
        {
            c[k++]=b[i];
        }
        else
        {
            if(sp.empty())
            {
                sp.push(b[i]);
            }
            else
            {
                if(youxian(b[i])>=youxian(sp.top())) //这里的优先级条件为大于等于
                {
                    if(youxian(b[i])==4)
                    {
                        while(sp.top()!='(')
                        {
                            c[k++]=sp.top();
                            sp.pop();
                        }
                        sp.pop();
                    }
                    else
                    {
                        sp.push(b[i]);
                    }
                }
                else
                {
                    if(sp.top()!='(')
                    {
                        c[k++]=sp.top();
                        sp.pop();
                        sp.push(b[i]);
                    }
                    else
                    {
                        sp.push(b[i]);
                    }
                }
            }
        }
        i++;
    }
    while(!sp.empty())
    {
        c[k++]=sp.top();
        sp.pop();
    }
    int j;
    for(j=k-1;j>=0;j--)//逆输出
    {
        cout<<c[j];
    }
    cout<<endl;
}
void solve_pos(char a[])//求后缀式
{
    stack <char > sk;
    int i=0;
    int k=0;
    while(a[i]!='#')
    {
        if(a[i]>='a'&&a[i]<='z')
        {
            c[k++]=a[i];
        }
        else
        {
            if(sk.empty())
            {
                sk.push(a[i]);
            }
            else
            {
                if(youxian(a[i])>youxian(sk.top()))//这里与转前缀不同,优先级条件为大于
                {
                    if(youxian(a[i])==4)
                    {
                        while(sk.top()!='(')
                        {
                            c[k++]=sk.top();
                            sk.pop();
                        }
                        sk.pop();
                    }
                    else
                    {
                        sk.push(a[i]);
                    }
                }
                else
                {
                    if(sk.top()!='(')
                    {
                        c[k++]=sk.top();
                        sk.pop();
                        sk.push(a[i]);
                    }
                    else
                    {
                        sk.push(a[i]);
                    }
                }
            }
        }
        i++;
    }
    while(!sk.empty())
    {
        c[k++]=sk.top();
        sk.pop();
    }
    for(int j=0;j<k;j++)
    {
        cout<<c[j];
    }
    cout<<endl;
}
int main()
{
    cin>>a;
    int lenth =strlen(a);
    int i,j;
    for(i=0,j=lenth-2;i<lenth-1;j--,i++) //字符数组逆置
    {
        if(a[j]=='(')
        b[i]=')';
        else if(a[j]==')')
            b[i]='(';
        else b[i]=a[j];
    }
    b[i]='#';
    solve_pre(b);
    for(int q=0;q<lenth-1;q++)
    {
        if(a[q]!=')'&&a[q]!='(')
            cout<<a[q];
    }
    cout<<endl;
    solve_pro(a);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值