题目描述
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
输入
输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
输出
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
+*ab*-c/def a*b+c-d/e*f ab*cde/-f*+
发现前缀表达式和后缀的差不多,而中缀的话就把括号去掉就行。
#include<stdio.h> #include<string.h> char a[1000],ls[1000], la[1000]; int cmp(char z) { if(z == '+' || z == '-') return 1; if(z == '*' || z == '/') return 2; if(z == ')') return 3; if(z == '(') return 4; } int main() { scanf("%s",a); int i = 0,k = 0, c = 0; int str = strlen(a); str = str - 2; while(str >= 0) { if(a[str] >= 'a' && a[str] <= 'z') { la[c++] = a[str]; } else { if(k == 0 ) { ls[k++] = a[str]; } else { if(cmp(ls[k-1]) <= cmp(a[str])) { if(a[str] == '(') { k = k - 1; for(; ls[k] != ')'; k--) { la[c++] = ls[k]; } } else { ls[k++] = a[str]; } } else { if(ls[k-1] != ')') { la[c++] = ls[k-1]; ls[k-1] = a[str]; } else ls[k++] = a[str]; } } } str--; } c = c- 1; for(i = 0; i < k; i++) { printf("%c",ls[i]); } for(; c >= 0; c--) printf("%c",la[c]); printf("\n"); for(i = 0; a[i] != '#'; i++) { if(a[i] != '(' && a[i] != ')') { printf("%c",a[i]); } } printf("\n"); k = 0; memset(ls,0,sizeof(ls)); for(i = 0; a[i] != '#'; i++) { if(a[i] >= 'a' && a[i] <= 'z') { printf("%c",a[i]); } else { if(k == 0) { ls[k++] = a[i]; } else { if(cmp(ls[k-1]) >= cmp(a[i])) { if(ls[k-1]!= '(') { printf("%c",ls[k-1]); ls[k-1] = a[i]; } else { ls[k++] = a[i]; } } else { if(a[i] == ')') { k = k-1; for(; ls[k]!='('; k--) { printf("%c",ls[k]); } } else { ls[k++] = a[i]; } } } } } k = k - 1; while(k>=0) { printf("%c",ls[k]); k--; } printf("\n"); return 0; }