题意 :实际上就是让我们建树,然后遍历树,逆序输出。。
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <stack>
using namespace std;
class Node
{
public :
char data;
int left,right;
}node[10005];
char s[10005];
stack<int >st;
queue<int >qu;
int result[10005],inpos;
void bfs(int root) //从根节点开始层次遍历,记录结果
{
while(!qu.empty())
qu.pop();
qu.push(root);
result[inpos++] = node[root].data;
while(!qu.empty())
{
int t = qu.front(); //拿出一个节点开始遍历
qu.pop();
if(node[t].left != -1)
{
result[inpos++] = node[node[t].left].data;
qu.push(node[t].left); // 队是先进先出的
}
if(node[t].right != -1)
{
result[inpos++] = node[node[t].right].data;
qu.push(node[t].right);
}
}
}
int main()
{
int t;
scanf("%d",&t);
getchar();
while(t--)
{
scanf("%s",s);
while(!st.empty())
st.pop();
for(int i = 0 ; i < strlen(s) ; i++ )
{
if(s[i]>='a' && s[i]<= 'z')
{
st.push(i); // 我们每次入栈的是根节点
node[i].data = s[i];
node[i].left = -1;
node[i].right = -1;
}
else
{
int r = st.top();
st.pop();
int l = st.top();
st.pop();
node[i].data = s[i]; // 构建一棵小树,然后还是根节点入栈
node[i].left = l;
node[i].right = r;
st.push(i);
}
}
inpos = 0;
bfs(st.top());
for(int i = inpos-1 ; i >= 0 ; i--) // 倒序输出
printf("%c",result[i]);
printf("\n");
}
return 0;
}