#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<string>
#include<stack>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
const int maxn=10005;
const int maxlen=12;
char s[maxn][maxlen];
int L;
struct Node
{
int l,r,a;
Node(){}
Node(int ll,int rr,int aa)
{
l=ll,r=rr,a=aa;
}
}node[maxn*4];
int newnode(int l,int r,int a)
{
node[L++]=Node(l,r,a);
return L-1;
}
bool isop(char c)
{
return c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')';
}
int dfs(int,int);
int dfs1(int l,int r)//解析x*(y)之类仅含*/运算的表达式
{
if(l==r)return newnode(-1,-1,l);
queue<pii>q;
int isgua=0,last=l;
for(int i=l;i<=r;i++)
if(isop(s[i][0]))
{
if(s[i][0]=='(')
{
isgua++;
}
else if(s[i][0]==')')
{
isgua--;
}
else if(isgua==0)
{
if(s[i][0]=='*'||s[i][0]=='/')
{
q.push(make_pair(last,i-1));
last=i+1;
}
}
}
q.push(make_pair(last,r));
int rt=-1;
while(!q.empty())
{
pii x=q.front();q.pop();
int a=x.first,b=x.second;
if(rt==-1)rt=dfs(a,b);
else rt=newnode(rt,dfs(a,b),a-1);
}
return rt;
}
int dfs(int l,int r)//解析所有种类表达式
{
if(l==r)return newnode(-1,-1,l);
queue<pii>q;
int isgua=0;
int last=l;
for(int i=l;i<=r;i++)
if(isop(s[i][0]))
{
if(s[i][0]=='(')
{
isgua++;
}
else if(s[i][0]==')')
{
isgua--;
}
else if(isgua==0)
{
if(s[i][0]=='+'||s[i][0]=='-')q.push(make_pair(last,i-1)),last=i+1;
}
}
q.push(make_pair(last,r));
if(q.size()==1&&s[l][0]=='('&&s[r][0]==')') //剥离括号
{
while(!q.empty())
q.pop();
return dfs(l+1,r-1);
}
int rt=-1;
while(!q.empty())
{
pii x=q.front();q.pop();
int a=x.first,b=x.second;
if(rt==-1)rt=dfs1(a,b);
else rt=newnode(rt,dfs1(a,b),a-1);
}
return rt;
}
void dfspath(int rt,int& sum)
{
if(node[rt].l!=-1)dfspath(node[rt].l,sum);
if(node[rt].r!=-1)dfspath(node[rt].r,sum);
if(sum==0)printf("%s",s[node[rt].a]),sum++;
else printf(" %s",s[node[rt].a]);
}
/*
15
( 1 + 2 ) * 4 + 2 * 3 - ( 1 )
21
( 1 + ( 2 ) ) * ( 4 + 2 ) * 3 - ( ( 1 ) )
*/
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
scanf("%s",&s[i]);
L=0;
int rt=dfs(0,n-1);
int sum=0;
dfspath(rt,sum);
puts("");
}
return 0;
}
+-*、()表达式转逆波兰
最新推荐文章于 2023-03-24 23:56:40 发布