暑假集训day7——算术表达式的转换

算术表达式的转换

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic Discuss

Problem Description

小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。

   因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。

Input

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

Output

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

Sample Input

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

Sample Output

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

Hint

Source

#include<stdio.h>
#include<string.h>

int i;
char b[1111111], a[1111111], ar[1111111];
char m;

int f1(char x)
{
    if(x == '+' || x == '-')
    {
        return 1;
    }

    else if(x == '*' || x == '/')
    {
        return 2;
    }

    else if(x == '(')
    {
        return 3;
    }

    else if(x == ')')
    {
        return 4;
    }

    else
    {
        return 0;
    }
}

void qian(char *b)
{
    int len = strlen(b);
    int q = -1, top = -1;

    for(i = len - 1; i >= 0; i--)
    {
        if(b[i] >= 'a' && b[i] <= 'z')
        {
            a[++q] = b[i];
        }

        else
        {
            if(top == -1)
            {
                ar[++top] = b[i];
            }

            else
            {
                if(f1(b[i]) >= f1(ar[top]))
                {
                    if(f1(b[i]) == 3)
                    {
                        while(ar[top] != ')')
                        {
                            a[++q] = ar[top--];
                        }

                        top--;
                    }

                    else
                    {
                        ar[++top] = b[i];               //前缀表达式当遇到优先级相同时,直接压入栈中,后缀表达式则不是这样
                    }
                }

                else
                {
                    if(ar[top] != ')')
                    {
                        a[++q] = ar[top];
                        ar[top] = b[i];
                    }

                    else
                    {
                        ar[++top] = b[i];
                    }
                }
            }
        }

    }

    while(top > -1)
    {
        a[++q] = ar[top--];
    }

    while(q > -1)
    {
        printf("%c", a[q--]);
    }

    printf("\n");
}

void zhong(char *b)
{
    char x;
    int len = strlen(b);

    for(i = 0; i < len; i++)
    {
        x = b[i];

        if(x != '(' && x != ')')
        {
            printf("%c", x);
        }
    }

    printf("\n");
}

void hou(char *b)
{
    int len = strlen(b);
    int top = -1;

    for(i = 0; i < len; i++)
    {
        if(b[i] >= 'a' && b[i] <= 'z')
        {
            printf("%c", b[i]);
        }

        else
        {
            if(top == -1)
            {
                ar[++top] = b[i];
            }

            else
            {
                if(f1(b[i]) > f1(ar[top]))
                {
                    if(f1(b[i]) == 4)
                    {
                        while(ar[top] != '(')
                        {
                            printf("%c", ar[top--]);
                        }

                        top--;
                    }

                    else
                    {
                        ar[++top] = b[i];
                    }
                }

                else
                {
                    if(ar[top] != '(')
                    {
                        printf("%c", ar[top]);            //后缀表达式当遇到优先级相同时,会直接输出,在压入栈中
                        ar[top] = b[i];
                    }

                    else
                    {
                        ar[++top] = b[i];
                    }
                }
            }
        }
    }

    while(top > -1)
    {
        printf("%c", ar[top--]);
    }

    printf("\n");
}

int main(void)
{
    i = -1;

    while(scanf("%c", &m) && m != '#')
    {
        b[++i] = m;
    }

    qian(b);
    zhong(b);
    hou(b);


    return 0;
}

一:

二:

后缀表达式当遇到优先级相同的情况:

前缀表达式当遇到优先级相同的情况:

猜你喜欢

转载自blog.csdn.net/Eider1998/article/details/81451073