栈的简单应用之中缀表达式转后缀表达式(C语言实现逆波兰式)

1、前言

  普通人在书写计算式时会选择中缀表达式,这样符合人脑的认知习惯。可计算机处理时后缀表达式才能使处理速度更快,其缘由是利用堆栈结构减小计算机内存访问。同时它也是一个很好锻炼栈这个数据结构的应用的问题。如下是用c语言实现中缀表达式到后缀表达式的转换的代码。本文仅讨论转换,不涉及计算。实际上若是了解了栈是如何在这上面应用,计算和前缀、中缀、后缀的相互计算和转换便简单了许多。对于三只种表达方式的转换,还有的作法是创建二叉树,录入数据,三种不一样的遍历方式就是三种表达方式。本文如有错误欢迎指出。数据结构

2、代码

#include <stdio.h>
int main(void)
{
    int top=-1;
    char s[25],temp;        //栈的大小根据须要更改,或者能够用内存分配来解决
    while((temp=getchar())!='\n')
    {
        if(temp>='A'&&temp<='Z'||temp>='a'&&temp<='z'||temp>='0'&&temp<='9'||temp=='.')        //包含数字表达式和字母表达式,支持小数
            printf("%c",temp);
        else
        {
            if(temp=='*'||temp=='/')
            {
                while(top>=0&&(s[top]=='*'||s[top]=='/'))        //保证栈不会越界
                    printf("%c",s[top--]);
                s[++top]=temp;
            }
            else if(temp=='+'||temp=='-')
            {
                while(s[top]!='('&&top>=0)
                    printf("%c",s[top--]);
                s[++top]=temp;
            }
            else if(temp=='(')
                s[++top]=temp;
            else if(temp==')')
            {
                while(s[top]!='(')
                    printf("%c",s[top--]);
                top--;
            }
        }
    }
    while(top>=0)
        printf("%c",s[top--]);                //余下运算符出栈
    return 0;
}

3、分析

1.转换规则

  • 遇到数字字符直接输出或通过转换成数字后输出
  • 遇到‘(’字符直接进栈
  • 遇到‘)’字符,将‘(’字符前的运算符依次出栈并输出,‘(’字符只出栈,不输出
  • 遇到运算符时,将优先级比此运算符小或等于的运算符依次出栈,再将其入栈
  • 读取完整个串后,将栈中全部运算符出栈

2.注意事项

在写判断条件时注意逻辑要清晰,肯定出入栈不会越界,并且全部元素都正确的出入栈,不要有出栈遗漏或者入栈重叠的状况,肯定全部转换条件都完整的进行了表达,注意某些特殊状况,尽可能作到全面。code

相关文章
相关标签/搜索