算术表达式的转换
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
输入
输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
输出
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
+*ab*-c/def a*b+c-d/e*f ab*cde/-f*+
提示
参考算法
1)求输入串的逆序。
2)检查输入的下一元素。
3)假如是操作数,把它添加到输出串中。
4)假如是闭括号,将它压栈。
5)假如是运算符,则
i)假如栈空,此运算符入栈。
ii)假如栈顶是闭括号,此运算符入栈。
iii)假如它的优先级高于或等于栈顶运算符,此运算符入栈。
iv)否则,栈顶运算符出栈并添加到输出串中,重复步骤5。
6)假如是开括号,栈中运算符逐个出栈并输出,直到遇到闭括号。闭括号出栈并丢弃。
7)假如输入还未完毕,跳转到步骤2。
8)假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。
9)求输出串的逆序。
但是,这里要求输出三个表达式,而且前缀式与后缀式有一点不同:对于前缀式,栈顶的符号优先级要大于即将要放入栈的符号的优先级,然后输出栈顶符号‘*’或‘/’,然后再将当前符号放入栈内;而对于后缀式,栈顶的符号优先级要大于等于当前符号的优先级,然后将栈顶符号‘*’或‘/’或‘+’或‘-’输出,然后再讲当前符号放入栈内。
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<stack>
using namespace std;
stack<char> s;
char a[1000];
int cou;
void cmp(char st[],int flg) //标记变量flg来记录是求前缀式还是后缀式
{
int len=strlen(st);
cou=0;
for(int i=0; i<len; i++)
{
if(st[i]>='a'&&st[i]<='z')
a[cou++]=st[i];
else if(st[i]=='(')
s.push(st[i]);
else if(st[i]==')')
{
while(!s.empty()&&s.top()!='(')
{
a[cou++]=s.top();
s.pop();
}
s.pop();
}
else if(st[i]=='+'||st[i]=='-')
{
if(flg)
{
while(!s.empty()&&s.top()!='('&&(s.top()=='*'||s.top()=='/'))
{
a[cou++]=s.top();
s.pop();
}
}
else
{
while(!s.empty()&&s.top()!='(')
{
a[cou++]=s.top();
s.pop();
}
}
s.push(st[i]);
}
else if(st[i]=='*'||st[i]=='/')
{
while(!s.empty()&&s.top()!='('&&(s.top()=='*'||s.top()=='/'))
{
a[cou++]=s.top();
s.pop();
}
s.push(st[i]);
}
}
while(!s.empty())
{
a[cou++]=s.top();
s.pop();
}
}
int main()
{
char st1[1000],st2[1000];
cin>>st1;
int len=strlen(st1);
int i=0;
int j=len-2;
for(; i<len-1; i++,j--)
{
if(st1[i]=='(')
st2[j]=')';
else if(st1[i]==')')
st2[j]='(';
else st2[j]=st1[i];
}
cmp(st2,1);
int len1=strlen(a);
for(int i=len1-1; i>=0; i-- )<span style="white-space:pre"> </span>//前缀输出
cout<<a[i];
cout<<endl;
for(int i=0; i<len-1; i++)<span style="white-space:pre"> </span>//中缀输出
if(st1[i]!='('&&st1[i]!=')')
cout<<st1[i];
cout<<endl;
cmp(st1,0);
for(int i=0; i<len1; i++ )<span style="white-space:pre"> </span>//后缀输出
cout<<a[i];
cout<<endl;
return 0;
}