【中缀转换成后缀或者前缀的思想、过程以及算法实现】

来源:互联网 发布:mac平面设计用什么软件 编辑:程序博客网 时间:2024/06/06 09:06

首先,介绍一下中缀转换成前缀和后缀的思想(有摘抄的部分):

这里我给出一个中缀表达式~
a+b*c-(d+e)
第一步:按照运算符的优先级对所有的运算单位加括号~
        式子变成拉:((a+(b*c))-(d+e))
第二步:转换前缀与后缀表达式
        前缀:把运算符号移动到对应的括号前面
              则变成拉:-( +(a *(bc)) +(de))
              把括号去掉:-+a*bc+de  前缀式子出现
        后缀:把运算符号移动到对应的括号后面
              则变成拉:((a(bc)* )- (de)+ )-
              把括号去掉:abc*-de+-  后缀式子出现

其次,把前缀转换成后缀的过程(此仅提供前缀转换成后缀,不提供转换成后缀后通过后缀表达式计算结果)

(1)首先定义一个数组s1,把中缀表达式存储在数组s1中;并且定义一个动态数组s2。
(2)其次,定义一个栈s。
(3)然后从数组中从s1[0]开始一个个取出字符压入栈s中,遇到'#'字符结束。在这个过程中:遇到数字的时候放入数组s2中;遇到运算符时,先与栈s的栈顶元素比较,如果运算级大于栈顶运算符,将运算符压入栈s中并令栈顶top++,否则栈顶元素出栈后放入数组s2中。
(4)当遇到’#‘字符的时候,把'#'字符放入数组s2中。转换过程结束
(5)while(s2[j]!='#') printf("%c",s2[j++]);打印出后缀表达式

最后,中缀转换成后缀表达式的代码如下(中缀转换成前缀的同理):

#include<stdio.h>#include<malloc.h>#define StackMaxSize 30typedef struct stack{char a[StackMaxSize];int top;}STACK;int Pre(char op){switch(op){case '+':case '-':return 1;case '*':case '/':return 2;case '(':case '#':default:return 0;}}char *Change(char *s1){STACK s;int i=0,j=0;char ch,*s2;s2=(char *)malloc(sizeof(char));s.top=-1;s.a[++s.top]='#';ch=s1[i++];while(ch!='#'){if(ch=='(')        {s.a[++s.top]=ch;ch=s1[i++];}else if(ch==')'){while(s.a[s.top]!='('){s2[j++]=s.a[s.top--];}s.top--;ch=s1[i++];}else if(ch=='+'||ch=='-'||ch=='*'||ch=='/'){while(Pre(s.a[s.top])>=Pre(ch)){s2[j++]=s.a[s.top--];}s.a[++s.top]=ch;ch=s1[i++];}else{s2[j++]=ch;ch=s1[i++];}}ch=s.a[s.top--];while(ch!='#'){s2[j++]=ch;ch=s.a[s.top--];}s2[j++]='#';return s2;}void main(){int i=1,j=1;char c,*s1,*s2;s1=(char *)malloc(sizeof(char));printf("请输入中缀表达式\n");while((c=getchar())!='#'){s1[i++]=c;}s1[i]='#';printf("\n");s2=Change(s1);printf("转换后的中缀表达式\n");while(s2[j]!='#')printf("%c",s2[j++]);printf("\n");}