算术表达式的转换
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<stdio.h> #include<stdlib.h> #include<stack> #include<string.h> #include<iostream> using namespace std; stack<char>s; char c[100]; //设置一个全局变量,存放出栈的数和表达式。为的是,在前缀表达式中需要倒着输出 int cnt; void change(char a[],int f) //f的作用是判断前缀和中缀表达式,f=1表示中缀,f=0表示后缀 { memset(c,0,sizeof(c)); int i,n; cnt=0; n=strlen(a); for(i=0;i<=n;i++) { if(a[i]>='a'&&a[i]<='z') c[cnt++]=a[i]; else if(a[i]=='(') s.push(a[i]); else if(a[i]=='+'||a[i]=='-') { if(f) { while(!s.empty()&&s.top()!='('&&(s.top()=='*'||s.top()=='/')) { c[cnt++]=s.top(); s.pop(); } s.push(a[i]); } else{ while(!s.empty()&&s.top()!='(') { c[cnt++]=s.top(); s.pop(); } s.push(a[i]); } } else if(a[i]=='*'||a[i]=='/') { if(f)s.push(a[i]); else{ while(!s.empty()&&s.top()!='('&&(s.top()=='*'||s.top()=='/')) { c[cnt++]=s.top(); s.pop(); } s.push(a[i]); } } else if(a[i]==')') { while(s.top()!='('&&!s.empty()) { c[cnt++]=s.top(); s.pop(); } s.pop(); } else break; } while(!s.empty()) { c[cnt++]=s.top(); s.pop(); } } int main() { int i,j; char a[1000],b[1000]; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); cin>>a; int m=strlen(a); m=m-1; for(i=0,j=m-1;i<m;i++,j--) //前缀式是将表达式逆置,然后传入函数 { if(a[j]=='(') b[i]=')'; else if(a[j]==')') b[i]='('; else b[i]=a[j]; } change(b,1); for(i=cnt-1;i>=0;i--) cout<<c[i]; cout<<endl; for(i=0;i<m;i++) //中缀表达式 { if(a[i]!='('&&a[i]!=')'&&a[i]!='#') cout<<a[i]; } cout<<endl; change(a,0); //后缀表达式 for(i=0;i<cnt;i++) cout<<c[i]; return 0; }