算术表达式的转换
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
Problem Description
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
Input
输入一算术表达式,以’#'字符作为结束标志。(数据保证无空格,只有一组输入)
Output
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
Sample Input
a*b+(c-d/e)*f#
Sample Output
+ab-c/def
ab+c-d/ef
abcde/-f+
Hint
以下引用自 chensongxian 博客园
将中缀表达式转换为前缀表达式
转换步骤如下:
1.初始化两个栈:运算符栈s1,储存中间结果的栈s2
2.从右至左扫描中缀表达式
3.遇到操作数时,将其压入s2
4.遇到运算符时,比较其与s1栈顶运算符的优先级
如果s1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈
否则,若优先级比栈顶运算符的较高或相等,也将运算符压入s1
否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较
5.遇到括号时
如果是右括号“)”,则直接压入s1
如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃
6.重复步骤2至5,直到表达式的最左边
7.将s1中剩余的运算符依次弹出并压入s2
8.依次弹出s2中的元素并输出,结果即为中缀表达式对应的前缀表达式
将中缀表达式转换为后缀表达式
1.初始化两个栈:运算符栈s1和储存中间结果的栈s2;
2.从左至右扫描中缀表达式;
3.遇到操作数时,将其压s2;
4.遇到运算符时,比较其与s1栈顶运算符的优先级:
如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
否则,若优先级比栈顶运算符的高,也将运算符压入s1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况);
否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较;
5.遇到括号时:
如果是左括号“(”,则直接压入s1;
如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃;
6.重复步骤2至5,直到表达式的最右边;
7.将s1中剩余的运算符依次弹出并压入s2;
8.依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)
#include <stdio.h>
#include <stack>
#include <string.h>
using namespace std;
int judge1(char a,char b) //前缀比较判断
{
if((a=='*'||a=='/')&&(b=='*'||b=='/'))
return 1;
if((a=='+'||a=='-')&&(b=='+'||b=='-'))
return 1;
if((a=='+'||a=='-')&&(b=='*'||b=='/'))
return 1;
if((a=='*'||a=='/')&&(b=='+'||b=='-'))
return 0;
}
int judge2(char a,char b) //后缀比较判断
{
if((a=='*'||a=='/')&&(b=='*'||b=='/'))
return 0;
if((a=='+'||a=='-')&&(b=='+'||b=='-'))
return 0;
if((a=='+'||a=='-')&&(b=='*'||b=='/'))
return 1;
if((a=='*'||a=='/')&&(b=='+'||b=='-'))
return 0;
}
int main()
{
char s[101];
int i;
gets(s);
stack<char>s1;
stack<char>s2;
int len=strlen(s);
for(i=len-2; i>=0; i--)
{
if(s[i]>='a'&&s[i]<='z')
{
s2.push(s[i]);
}
else
{
if(s1.empty()||s1.top()==')'||s[i]==')')
{
s1.push(s[i]);
continue;
}
if(s[i]=='(')
{
while(s1.top()!=')')
{
s2.push(s1.top());
s1.pop();
}
s1.pop();
continue;
}
if(!s1.empty())
{
if(judge1(s1.top(),s[i]))
{
s1.push(s[i]);
}
else
{
while(!s1.empty())
{
if(judge1(s1.top(),s[i])==1) break;
if(s1.top()==')') break;
s2.push(s1.top());
s1.pop();
}
s1.push(s[i]);
}
}
}
}
while(!s1.empty())
{
// printf("%c",s1.top());
s2.push(s1.top());
s1.pop();
}
// printf("\n");
while(!s2.empty())
{
printf("%c",s2.top());
s2.pop();
}
printf("\n");
for(i=0;i<len-1;i++)
{
if(s[i]!='('&&s[i]!=')')
printf("%c",s[i]);
}printf("\n");
for(i=0; i<len-1; i++)
{
if(s[i]>='a'&&s[i]<='z')
{
s2.push(s[i]);
}
else
{
if(s1.empty()||s1.top()=='('||s[i]=='(')
{
s1.push(s[i]);
continue;
}
if(s[i]==')')
{
while(s1.top()!='(')
{
s2.push(s1.top());
s1.pop();
}
s1.pop();
continue;
}
if(!s1.empty())
{
if(judge2(s1.top(),s[i]))
{
s1.push(s[i]);
}
else
{
while(!s1.empty())
{
if(judge2(s1.top(),s[i])==1) break;
if(s1.top()=='(') break;
s2.push(s1.top());
s1.pop();
}
s1.push(s[i]);
}
}
}
}
while(!s1.empty())
{
// printf("%c",s1.top());
s2.push(s1.top());
s1.pop();
}
//printf("\n");
int cn=0;
char s3[10001];
while(!s2.empty())
{
s3[cn++]=s2.top();
s2.pop();
}
for(i=cn-1;i>=0;i--) printf("%c",s3[i]);
printf("\n");
return 0;
}