算术表达式的转换

算术表达式的转换

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
   因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。

输入

 输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)

输出

 输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。

示例输入

a*b+(c-d/e)*f#

示例输出

+*ab*-c/def
a*b+c-d/e*f
ab*cde/-f*+

提示


参考算法

1)求输入串的逆序。

2)检查输入的下一元素。

3)假如是操作数,把它添加到输出串中。

4)假如是闭括号,将它压栈。

5)假如是运算符,则

i)假如栈空,此运算符入栈。

ii)假如栈顶是闭括号,此运算符入栈。

iii)假如它的优先级高于或等于栈顶运算符,此运算符入栈。

iv)否则,栈顶运算符出栈并添加到输出串中,重复步骤5

6)假如是开括号,栈中运算符逐个出栈并输出,直到遇到闭括号。闭括号出栈并丢弃。

7)假如输入还未完毕,跳转到步骤2

8)假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。

9)求输出串的逆序。

但是,这里要求输出三个表达式,而且前缀式与后缀式有一点不同:对于前缀式,栈顶的符号优先级要大于即将要放入栈的符号的优先级,然后输出栈顶符号‘*’或‘/’,然后再将当前符号放入栈内;而对于后缀式,栈顶的符号优先级要大于等于当前符号的优先级,然后将栈顶符号‘*’或‘/’或‘+’或‘-’输出,然后再讲当前符号放入栈内。  

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<stack>
using namespace std;
stack<char> s;
char a[1000];
int cou;
void cmp(char st[],int flg)      //标记变量flg来记录是求前缀式还是后缀式
{
    int len=strlen(st);
    cou=0;
    for(int i=0; i<len; i++)
    {
        if(st[i]>='a'&&st[i]<='z')
            a[cou++]=st[i];
        else if(st[i]=='(')
            s.push(st[i]);
        else if(st[i]==')')
        {
            while(!s.empty()&&s.top()!='(')
            {
                a[cou++]=s.top();
                s.pop();
            }
            s.pop();
        }
        else if(st[i]=='+'||st[i]=='-')
        {
            if(flg)
            {
                while(!s.empty()&&s.top()!='('&&(s.top()=='*'||s.top()=='/'))
                {
                    a[cou++]=s.top();
                    s.pop();
                }
            }
            else
            {
                while(!s.empty()&&s.top()!='(')
                {
                    a[cou++]=s.top();
                    s.pop();
                }
            }
            s.push(st[i]);
        }
        else if(st[i]=='*'||st[i]=='/')
        {
            while(!s.empty()&&s.top()!='('&&(s.top()=='*'||s.top()=='/'))
            {
                a[cou++]=s.top();
                s.pop();
            }
            s.push(st[i]);
        }
    }
    while(!s.empty())
    {
        a[cou++]=s.top();
        s.pop();
    }
}
int main()
{
    char st1[1000],st2[1000];
    cin>>st1;
    int len=strlen(st1);
    int i=0;
    int j=len-2;
    for(; i<len-1; i++,j--)
    {
        if(st1[i]=='(')
            st2[j]=')';
        else if(st1[i]==')')
            st2[j]='(';
        else st2[j]=st1[i];
    }
    cmp(st2,1);
    int len1=strlen(a);
    for(int i=len1-1; i>=0; i-- )<span style="white-space:pre">	</span>//前缀输出
        cout<<a[i];
    cout<<endl;
    for(int i=0; i<len-1; i++)<span style="white-space:pre">		</span>//中缀输出
        if(st1[i]!='('&&st1[i]!=')')
            cout<<st1[i];
    cout<<endl;
    cmp(st1,0);
    for(int i=0; i<len1; i++ )<span style="white-space:pre">		</span>//后缀输出
        cout<<a[i];
    cout<<endl;
    return 0;
}



 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值