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

一、前言

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

二、代码

#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;
}

三、分析

1.转换规则

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

2.注意事项

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

posted @ 2020-01-29 00:47  comixH  阅读(935)  评论(0编辑  收藏  举报