您的位置:首页 > 其它

中缀式 前缀式 后缀式 转换

2017-10-23 22:17 316 查看

算术表达式的转换

Time Limit: 1000MS
Memory Limit: 65536KB
SubmitStatistic

Discuss

Problem Description

小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
   因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。

Input

 输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)

Output

 输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。

Example Input

a*b+(c-d/e)*f#


Example Output

+*ab*-c/def
a*b+c-d/e*f
ab*cde/-f*+


Hint

#include<iostream>
#include<string.h>
using namespace std;
char b[100010], s[100010] , print[100010];
int swi(char c)//前缀式优先级
{
if(c=='+'||c=='-') return 1;
if(c=='*'||c=='/') return 2;
if(c==')')  return 3;
if(c=='(') return 4;
return 0;
}
int swa(char c)//后缀式优先级
{
if(c=='+'||c=='-') return 1;
if(c=='*'||c=='/') return 2;
if(c=='(') return 3;
if(c==')') return 4;
return 0;
}
void display(int k)
{
for(int i = k;i>0;i--)
cout << print[i];
cout << endl;
}

//逆序读取数组,存入输出数组,再逆序输出
void qian(int n)
{
memset(s,0,sizeof(s[0]));
memset(print,0,sizeof(print[0]));
char c;
int i ,k = 0, top = 0;
for(i = n;i>0;i--)//逆读取
{
c = b[i];
if(c>='a' && c<='z')
print[++k] = c;
else if(c != '(')
{
if(c == ')')
s[++top] = c;
else
{
while(top!=0&&s[top]!=')'&& swi(s[top]) > swi(c))
{
print[++k] = s[top];
top--;
}
s[++top] = c;
}
}
else
{
while(s[top]!= ')')
{
print[++k] = s[top];
top--;
}
top--;
}
}
if(top!=0)
{
while(top)
print[++k] = s[top--];
}
display(k);
}
void hou(int n)
{
char c;
int top = 0;
memset(s,0,sizeof(s[0]));
for(int i = 1;i<=n;i++)
{
c = b[i];
if(c>='a' && c<='z')
cout << c;
else
{
if(top==0)
s[++top] = c;
else if(swa(c) <= swa(s[top]))
{
if(s[top] == '(')
s[++top] = c;
else
{
cout << s[top];
s[top] = c;
}
}
else
{
if(c==')')
{
while(s[top]!='(')
{
cout << s[top];
top--;
}
top--;
}
else s[++top] = c;
}
}
}
if(top!=0)
{
while(top!=0)
cout << s[top--];
}
cout << endl;
}
int main()
{
char c;
int n = 0;
while(cin >> c &&c!='#')
b[++n] = c;//存入数组中
qian(n);

for(int i = 1;i<=n;i++)
{
if(b[i]!='('&&b[i]!=')')
cout << b[i];
}
cout << endl;

hou(n);

return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: