算术表达式的转换
Time Limit: 1000MS Memory limit: 65536K
题目描述
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
输入
输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
输出
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
+*ab*-c/def a*b+c-d/e*f ab*cde/-f*+
写完这个代码,想死的心都有了,修了半天的bug
代码:
#include <string>
#include <iostream>
#include<stdio.h>
#include<string.h>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
int cmp(char ch) //给运算符定义一个数值表示优先级大小
{
if(ch=='+' || ch=='-')
return 1;
else if(ch=='*' || ch=='/' )
return 2;
else if(ch==')' || ch=='(' )
return 3; //括号的优先级最高
}
void Pre(char s[], int len )
{
int i, j;
char a[200]; int e=0;
for(i=len-2; i>=0; i--)
{
a[e++]=s[i];
}
stack<char>ff;
stack<char>gg;
char dd;
for(i=0; i<e; i++)
{
if(a[i]>='a' && a[i]<='z')
{
ff.push(a[i]);
}
else //如果是运算符的?
{
if(a[i]==')')
gg.push(a[i]);
else if( a[i]=='(' )
{
while(gg.top()!=')' )
{
dd=gg.top();
gg.pop();
ff.push(dd);
}
gg.pop();
}
else // + - * /
{
if( !gg.empty() && (cmp(gg.top() )> cmp(a[i])) ) //栈顶元素优先级大
{
if(gg.top()==')')
{
gg.push(a[i]);
}
else
{
dd=gg.top();
gg.pop();
ff.push(dd);
gg.push(a[i]);
}
}
else
{
gg.push(a[i]);
}
}
}
}
while(!gg.empty())
{
dd=gg.top();
ff.push(dd);
gg.pop();
}
while(!ff.empty())
{
dd=ff.top();
cout<<dd;
ff.pop();
}
cout<<endl;
}
void In(char s[], int len)
{
int i;
for(i=0; i<len-1; i++)
{
if(s[i]=='(' || s[i]==')')
continue;
else
cout<<s[i];
}
cout<<endl;
}
void Post(char s[], int len)
{
stack<char>q;
int i;
for(i=0; i<len-1; i++)
{
if(s[i]>='a' && s[i]<='z')
{
cout<<s[i];
}
else
{
if(q.empty())
{
q.push(s[i]);
}
else //栈非空
{
if(s[i]=='(')
{
q.push(s[i]);
}
else if(s[i]=='+')
{
if(q.top()=='(' )
{
q.push(s[i]);
}
else
{
cout<<q.top();
q.pop();
q.push(s[i]);
}
}
else if(s[i]=='-')
{
if(q.top()=='(')
{
q.push(s[i]);
}
else
{
cout<<q.top();
q.pop();
q.push(s[i]);
}
}
else if(s[i]=='*')
{
if(q.top()=='(' || q.top()=='+' || q.top()=='-' )
{
q.push(s[i]);
}
else
{
cout<<q.top();
q.pop();
q.push(s[i]);
}
}
else if(s[i]=='/')
{
if(q.top()=='+' || q.top()=='-' || q.top()=='(')
{
q.push(s[i]);
}
else
{
cout<<q.top();
q.pop();
q.push(s[i]);
}
}
else if(s[i]==')')
{
while(q.top()!='(')
{
cout<<q.top();
q.pop();
}
q.pop(); //将左括号弹出
}
}
}
}
while(!q.empty())
{
cout<<q.top();
q.pop();
}
}
int main()
{
char s[200];
int len;
int i, j;
scanf("%s", s);
len=strlen(s);
Pre(s, len);
In(s, len);
Post(s, len);
cout<<endl;
return 0;
}