一、前言
普通人在书写计算式时会选择中缀表达式,这样符合人脑的认知习惯。可计算机处理时后缀表达式才能使处理速度更快,其原因是利用堆栈结构减少计算机内存访问。同时它也是一个很好锻炼栈这个数据结构的应用的问题。以下是用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.注意事项
在写判断条件时注意逻辑要清晰,确定出入栈不会越界,而且所有元素都正确的出入栈,不要有出栈遗漏或者入栈重叠的情况,确定所有转换条件都完整的进行了表达,注意某些特殊情况,尽量做到全面。
来源:https://www.cnblogs.com/comixH/p/12239437.html