算术表达式的转换
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
输入
输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
输出
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
+*ab*-c/def a*b+c-d/e*f ab*cde/-f*+
提示
中缀转前缀的方法和转后缀的很类似;
转前缀先将中缀式逆置,让原来的左括号变右括号,右括号变左括号;
然后按求后缀式的方法将每次出栈的结果保存,再逆置输出。
中缀转前后缀参考来自:http://blog.youkuaiyun.com/antineutrino/article/details/6763722/
#include<bits/stdc++.h>
using namespace std;
char a[1000],b[1000],c[1000];
int youxian(char a)
{
if(a=='+'||a=='-')
return 1;
if(a=='*'||a=='/')
return 2;
if(a=='(')
return 3;
if(a==')')
return 4;
}
void solve_pre(char b[])//求前缀式
{
stack <char >sp;
int i=0;
int k=0;
while(b[i]!='#')
{
if(b[i]>='a'&&b[i]<='z')
{
c[k++]=b[i];
}
else
{
if(sp.empty())
{
sp.push(b[i]);
}
else
{
if(youxian(b[i])>=youxian(sp.top())) //这里的优先级条件为大于等于
{
if(youxian(b[i])==4)
{
while(sp.top()!='(')
{
c[k++]=sp.top();
sp.pop();
}
sp.pop();
}
else
{
sp.push(b[i]);
}
}
else
{
if(sp.top()!='(')
{
c[k++]=sp.top();
sp.pop();
sp.push(b[i]);
}
else
{
sp.push(b[i]);
}
}
}
}
i++;
}
while(!sp.empty())
{
c[k++]=sp.top();
sp.pop();
}
int j;
for(j=k-1;j>=0;j--)//逆输出
{
cout<<c[j];
}
cout<<endl;
}
void solve_pos(char a[])//求后缀式
{
stack <char > sk;
int i=0;
int k=0;
while(a[i]!='#')
{
if(a[i]>='a'&&a[i]<='z')
{
c[k++]=a[i];
}
else
{
if(sk.empty())
{
sk.push(a[i]);
}
else
{
if(youxian(a[i])>youxian(sk.top()))//这里与转前缀不同,优先级条件为大于
{
if(youxian(a[i])==4)
{
while(sk.top()!='(')
{
c[k++]=sk.top();
sk.pop();
}
sk.pop();
}
else
{
sk.push(a[i]);
}
}
else
{
if(sk.top()!='(')
{
c[k++]=sk.top();
sk.pop();
sk.push(a[i]);
}
else
{
sk.push(a[i]);
}
}
}
}
i++;
}
while(!sk.empty())
{
c[k++]=sk.top();
sk.pop();
}
for(int j=0;j<k;j++)
{
cout<<c[j];
}
cout<<endl;
}
int main()
{
cin>>a;
int lenth =strlen(a);
int i,j;
for(i=0,j=lenth-2;i<lenth-1;j--,i++) //字符数组逆置
{
if(a[j]=='(')
b[i]=')';
else if(a[j]==')')
b[i]='(';
else b[i]=a[j];
}
b[i]='#';
solve_pre(b);
for(int q=0;q<lenth-1;q++)
{
if(a[q]!=')'&&a[q]!='(')
cout<<a[q];
}
cout<<endl;
solve_pro(a);
return 0;
}