• 算术表达式的转换 分类: 栈和队列 2015-06-18 17:19 11人阅读 评论(0) 收藏


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

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

    示例输出

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

    #include <map>
    #include <set>
    #include <cmath>
    #include <stack>
    #include <queue>
    #include <time.h>
    #include <cstdio>
    #include <cctype>
    #include <vector>
    #include <string>
    #include <climits>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #define RR freopen("input.txt","r",stdin)
    #define WW freopen("output.txt","w",stdout)
    #define INF 0x3f3f3f3f
    
    using namespace std;
    
    char s[1110];
    
    char str[1100];
    
    char st[1100];
    
    int trans(char c)
    {
        if(c=='+'||c=='-')
            return 1;
        if(c=='*'||c=='/')
            return 2;
        return 3;
    }
    void head()
    {
        int len=strlen(s);
        int top=0,i;
        int End=0;
        for(i=len-1;i;i--)
        {
            if(s[i]=='#')
                break;
        }
        for( i--; i>=0; i--)
        {
            if(s[i]>='a'&&s[i]<='z')
            {
                str[top++]=s[i];
            }
            else if(s[i]!='(')
            {
                if(s[i]==')')
                {
                    st[++End]=s[i];
                }
                else
                {
                    while(End&&st[End]!=')'&&trans(st[End])>trans(s[i]))//这里是大于
                    {
                        str[top++]=st[End];
                        End--;
                    }
                    st[++End]=s[i];
                }
            }
            else
            {
                while(st[End]!=')')
                {
                    str[top++]=st[End];
                    End--;
                }
                End--;
            }
        }
        while(End)
        {
            str[top++]=st[End];
            End--;
        }
        for(int i=top-1; i>=0; i--)
        {
            cout<<str[i];
        }
        cout<<endl;
    }
    
    void mid()
    {
        for(int i=0; s[i]!='#'; i++)
        {
            if(s[i]!='('&&s[i]!=')')
            {
                cout<<s[i];
            }
        }
        cout<<endl;
    
    }
    
    void last()
    {
        int top=0;
        int End=0;
        for(int i=0; s[i]!='#'; i++)
        {
            if(s[i]>='a'&&s[i]<='z')
            {
                str[top++]=s[i];
            }
            else if(s[i]!=')')
            {
                if(s[i]=='(')
                {
                    st[++End]=s[i];
                }
                else
                {
                    while(End&&st[End]!='('&&trans(st[End])>=trans(s[i]))//这里是大于等于
                    {
                        str[top++]=st[End];
                        End--;
                    }
                    st[++End]=s[i];
                }
            }
            else
            {
                while(st[End]!='(')
                {
                    str[top++]=st[End];
                    End--;
                }
                End--;
            }
        }
        while(End)
        {
            str[top++]=st[End];
            End--;
        }
        for(int i=0;i<top;i++)
        {
            cout<<str[i];
        }
        cout<<endl;
    }
    int main()
    {
        scanf("%s",s);
        head();
        mid();
        last();
        return 0;
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Install Java on Ubuntu server
    Java 空引用访问静态不会发生空指针异常
    Java 什么时候使用static
    Java 空指针异常
    java 方法的返回值
    python中直接复制,浅拷贝,深拷贝
    python 操作ppt转换为pdf
    数组排序
    qooxdoo框架环境搭建
    python 链表实现 双向链表和单向循环链表
  • 原文地址:https://www.cnblogs.com/juechen/p/4722014.html
Copyright © 2020-2023  润新知