算术表达式的转换
算术表达式的转换
Time Limit: 1000MS Memory limit: 65536K
题目描述
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
输入
输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
输出
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
+*ab*-c/def a*b+c-d/e*f ab*cde/-f*+
提示
来源
示例程序
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; int op(char ch) { if(ch=='+' || ch == '-') return 1; else if( ch== '*' || ch == '/') return 2; else if(ch == '(' || ch == ')') return 3; } char st1[10005],st2[10005],st3[10005]; char pre[10005],mid[10005],last[10005]; int main() { char str[105]; char ch; int i=0,j=0,n=0; while(scanf("%c",&ch) && ch != '#') { str[n++]=ch; } //求前缀表达式要从后往前遍历字符串,再倒着输出 int k1=0,k2=0; for(i=n-1;i>=0;i--) { if((str[i]>='0' && str[i]<= '9') || (str[i]>='a' &&str[i]<='z')) st1[k1++]=str[i];//字符或数字直接进栈 else { if(str[i]==')')//右括号直接进栈 st2[++k2]=str[i]; else if(str[i]=='(') {//如果是左括号,把从栈顶到右括号之间的运算符全部输出到字符栈里并把右括号退栈 while(st2[k2] != ')') st1[k1++]=st2[k2--]; k2--; } else { if(op(st2[k2])>op(str[i]))//这里是栈顶元素优先级大于当前元素,要与后缀式中的》=区分注意 { if(st2[k2]==')') st2[++k2]=str[i]; else { st1[k1++]=st2[k2]; st2[k2]=str[i]; } } else st2[++k2]=str[i]; } } } while(k2>0)//如果栈中还有元素,全部输出到字符栈 st1[k1++]=st2[k2--]; for(i=k1-1;i>=0;i--) pre[j++]=st1[i]; pre[j]='\0'; //中缀表达式吧括号去掉 j=0; for(i=0;i<n;i++) { if(str[i] != '(' && str[i] != ')') mid[j++]=str[i]; } mid[j]='\0'; //转换为后缀表达式 j=0; int m=0; for(i=0;i<n;i++) { if((str[i]>= '0' && str[i] <='9') || str[i]>='a' && str[i]<='z') last[j++]=str[i]; else { if(str[i]=='(') st3[++m]=str[i]; else if(str[i]==')') { while(st3[m] != '(') last[j++]=st3[m--]; m--; } else { if(op(st3[m])>= op(str[i])) { if(st3[m] != '(') { last[j++]=st3[m]; st3[m]=str[i]; } else st3[++m]=str[i]; } else st3[++m]=str[i]; } } } while(m>0) last[j++]=st3[m--]; last[j]='\0'; printf("%s\n",pre); printf("%s\n",mid); printf("%s\n",last); return 0; }

浙公网安备 33010602011771号