算术表达式的转换
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
输入
输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
输出
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
+*ab*-c/def
a*b+c-d/e*f
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
感悟:STL确实挺方便.
/*
思路:将表达式分为3类::操作符,括号,字母.定义操作符的优先级
*/
# include <bits/stdc++.h>
using namespace std;
bool isoperator(char c);
int priority(char c);
void prefix_expression();
void postfix_expression();
char s[1000];
int main()
{
int i;
gets(s);
prefix_expression();
for(i=0;s[i]!='#';i++)
{
if(s[i]!='(' && s[i]!=')')
cout<<s[i];
}
cout<<endl;
postfix_expression();
return 0;
}
bool isoperator(char c)
{
return (c == '+' || c == '-' || c == '*' || c == '/');
}
int priority(char c)
{
if(c == '+' || c == '-')
{
return 1;
}
if(c == '*' || c == '/')
{
return 2;
}
}
void prefix_expression()
{
int i;
stack<char>S1;//运算符栈S1;
stack<char>S2;//和储存中间结果的栈S2
for(i=strlen(s)-1;i>=0;i--)
{
if('a'<=s[i] && s[i]<='z')
S2.push(s[i]);
else
{
if(isoperator(s[i]))
{
if(S1.empty() || S1.top() == ')')
S1.push(s[i]);
else
{
if( priority(s[i]) >= priority(S1.top()) ) //注意求前缀表达式的操作符优先级判定
S1.push(s[i]);
else
{
S2.push(S1.top());
S1.pop();
S1.push(s[i]);
}
}
}
else
{
if(s[i] == ')')
S1.push(s[i]);
if(s[i] == '(')
{
while(S1.top()!=')')
{
S2.push(S1.top());
S1.pop();
}
S1.pop();
}
}
}
}
while(!S1.empty())
{
S2.push(S1.top());
S1.pop();
}
while(!S2.empty())
{
cout<<S2.top();
S2.pop();
}
cout<<endl;
}
void postfix_expression()
{
int i;
stack<char>S;
for(i=0;i<strlen(s)-1;i++)
{
if('a'<=s[i] && s[i]<='z' || 'A'<=s[i] && s[i] <='Z')
cout<<s[i];
else
{
if(isoperator(s[i]))
{
if(S.empty() || S.top() == '(')
S.push(s[i]);
else
{
if(priority(s[i]) > priority(S.top()))//注意求后缀的优先级判定条件
S.push(s[i]);
else
{
cout<<S.top();
S.pop();
S.push(s[i]);
}
}
}
else
{
if(s[i]=='(')
S.push(s[i]);
if(s[i]==')')
{
while(S.top()!='(')
{
cout<<S.top();
S.pop();
}
S.pop();
}
}
}
}
while(!S.empty())
{
cout<<S.top();
S.pop();
}
cout<<endl;
}