栈应用:中缀转后缀

没多大技巧,严格按照规则,记住即可:
转换过程需要用到栈,具体过程如下:
1)如果遇到操作数,我们就直接将其输出。
2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。
3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。
4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) “的情况下我们才弹出” ( “,其他情况我们都不会弹出” ( "。
5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
这个老哥讲得细致https://www.cnblogs.com/hantalk/p/8734511.html,但是代码有问题(若进来str[i]为除号或乘号那么也应该比一比,乘除要出栈)

下面是我的无懈可击代码!

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char stack[100];
    int top=-1;
    int i = 0;
    char str[200];
    char que[200];
    int rear=0,front=0;
    printf("Type something.\n");
    scanf("%s",str);
    while(str[i] != '\0')
    {
        if(str[i] == '+' || str[i] == '-')//如果str[i]是加号或减号,则先弹出栈顶直到栈已空或栈顶元素为左括号,再将str[i]压入栈
        {
            if(top==-1)//若栈已空时,栈顶指针为空,找不到其元素,故须单独讨论
            {
                stack[++top]=str[i];
            }
            else
            {
                while(stack[top] == '+' || stack[top] == '-' || stack[top] == '*' || stack[top] == '/')
                {
                    que[++rear]=stack[top--];
                }
                stack[++top]=str[i];
            }
        }

        else if(str[i] == '*' || str[i] == '/')//如果str[i]是乘号或除号,则只有栈顶也是乘除号时才需要弹出
        {
            if(top==-1)//若栈已空时,栈顶指针为空,找不到其元素,故须单独讨论
            {
                stack[++top]=str[i];
            }
            else
            {
                while(stack[top] == '*' || stack[top] == '/')
                {
                    que[++rear]=stack[top--];
                }
                stack[++top]=str[i];
            }
        }

        else if(str[i] == '(')//如果str[i]是左括号则直接压入栈
        {
            stack[++top]=str[i];
        }

        else if(str[i] == ')')//如果str[i]是右括号,则打印并弹出栈中第一个左括号前的所有操作符,最后将此左括号直接弹出
        {
            while(stack[top] != '(')
            {
                que[++rear]=stack[top--];
            }
            stack[top--];
        }

        else//如果str[i]不是操作符则直接打印
        {
            que[++rear]=str[i];
        }
        i++;
    }
    while(top!=-1)//遍历后如果栈不为空,则弹出所有操作符
    {
        que[++rear]=stack[top--];
    }
    printf("\n输出\n");
    while(rear!=front)
    {
        printf("%c",que[++front]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42034217/article/details/84679679