由题意,我们可以建立一个二叉树。
然后中序遍历二叉树,得到最终的结果。
在中序遍历二叉树的时候,我们判断当前子树的根节点与其子节点的符号之间的关系。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#define LL long long
#define INF 1000000000
using namespace std;
struct list
{
char x;
int l;
int r;
int leap;
} node[5001];
char str[10001];
int vnum;
int dos(int x,int y)//把str字符串从x到y这一段转化成
{ //一颗二叉树,并且返回这颗二叉树的根节点
int i,j;
if(x==y)
{
node[vnum].l=-1;
node[vnum].r=-1;
node[vnum].x=str[x];
node[vnum].leap=0;
vnum++;
return vnum-1;
}
int vis[1001];
stack<int>st;
while(!st.empty())st.pop();
vector<int>vec;
vec.clear();
int ns,ss;
for(i=x; i<=y; i++)
{
if(str[i]=='(')
{
int sts=1;
for(j=i+1; j<=y; j++)
{
if(str[j]=='(')sts++;
if(str[j]==')')sts--;
if(sts==0)break;
}
int pp=dos(i+1,j-1);
vec.push_back(pp);
node[pp].leap=0;
i=j;
}
else
{
vec.push_back(vnum);
node[vnum].l=-1;
node[vnum].r=-1;
node[vnum].leap=1;
node[vnum].x=str[i];
vnum++;
}
}
int len=vec.size();
int ks[1001];
int knum;
knum=0;
for(i=0; i<len; i++)
{
int pp=vec[i];
if((node[pp].leap==1)&&(node[pp].x=='*'||node[pp].x=='/'))
{
int xx=ks[knum-1];
knum--;
node[pp].l=xx;
node[pp].r=vec[i+1];
i++;
}
ks[knum++]=pp;
}
int pa;
pa=ks[0];
for(i=1; i<knum; i++)
{
int pp=ks[i];
node[pp].l=pa;
node[pp].r=ks[i+1];
pa=pp;
i++;
}
return pa;
}
int need(int x,int y,int leap)//判断以x为根,以y为子节点,在中序遍历的时候是否需要加()
{
if(node[x].x=='/'&&leap==1)
{
if(node[y].x=='+'||node[y].x=='-'||node[y].x=='*'||node[y].x=='/')return 1;
}
if(node[x].x=='*'||node[x].x=='/')
{
if(node[y].x=='+'||node[y].x=='-')return 1;
}
if(node[x].x=='-'&&leap==1)
{
if(node[y].x=='+'||node[y].x=='-')return 1;
}
return 0;
}
void print(int x)//输出以x为根节点的中序遍历结果
{
if(node[x].l!=-1)
{
int ll=node[x].l;
if(need(x,ll,0))
{
putchar('(');
print(ll);
putchar(')');
}
else
{
print(ll);
}
}
putchar(node[x].x);
if(node[x].r!=-1)
{
int ll=node[x].r;
if(need(x,ll,1))
{
putchar('(');
print(ll);
putchar(')');
}
else
{
print(ll);
}
}
}
int main()
{
int _,i,j;
scanf("%d",&_);
for(j=1; j<=_; j++)
{
vnum=0;
scanf("%s",str);
int len=strlen(str);
int st=dos(0,len-1);
print(st);
cout<<endl;
}
return 0;
}