算术表达式的转换

算术表达式的转换

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.csdn.net/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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算术表达式转换为后缀表达式的步骤如下: 1. 创建一个空的栈和一个空的输出队列。 2. 从左到右扫描中缀表达式。 3. 如果扫描到的是操作数,将其加入输出队列。 4. 如果扫描到的是左括号,将其压入栈中。 5. 如果扫描到的是右括号,则将栈中的元素依次弹出并加入输出队列,直到遇到左括号为止。左括号右括号都不输出到结果队列。 6. 如果扫描到的是运算符,判断其优先级: - 如果该运算符的优先级低于或等于栈顶运算符的优先级,则将栈顶运算符弹出并加入输出队列,直到栈为空或者栈顶运算符优先级低于该运算符。 - 将该运算符压入栈中。 7. 重复步骤2到6,直到扫描完整个中缀表达式。 8. 如果栈中还有运算符,将它们依次弹出并加入输出队列。 9. 输出队列中的元素就是后缀表达式。 例如,将中缀表达式 "5 + 4 * 3 - 2" 转换为后缀表达式: 1. 创建一个空的栈和一个空的输出队列。 2. 从左到右扫描中缀表达式,首先遇到操作数 "5",将其加入输出队列。 3. 遇到运算符 "+",将其压入栈中。 4. 遇到操作数 "4",将其加入输出队列。 5. 遇到运算符 "*",由于 "*" 的优先级高于 "+",所以将 "*" 压入栈中。 6. 遇到操作数 "3",将其加入输出队列。 7. 遇到运算符 "-",由于 "-" 的优先级低于 "*",所以将 "*" 弹出并加入输出队列,然后将 "-" 压入栈中。 8. 遇到操作数 "2",将其加入输出队列。 9. 扫描完整个表达式后,将栈中剩余的运算符依次弹出并加入输出队列,得到后缀表达式 "5 4 3 * + 2 -"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值