题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2175
题目意思:
给一串字符,小写字母表示操作数,大写字母表示操作符,求一个字符串使该字符串用队列的方式的运行方式的结果与给出串用栈运行的结果一样。
解题思路:
依据栈的结构构造一棵树,所求的序列实际上就是这棵树的按层次逆序输出。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#define eps 1e-6
#define INF (1<<20)
#define PI acos(-1.0)
#define Max 11000
using namespace std;
struct Node
{
int father,left,right;
};
struct Node tree[Max]; //依据栈的结构构造一颗树
char ans[Max];
char save[Max];
int main()
{
int ca;
scanf("%d",&ca);
while(ca--)
{
scanf("%s",save);
int n=strlen(save);
memset(tree,-1,Max*sizeof(struct Node));
stack <int> mystack;
for(int i=0;i<n;i++)
{
if(save[i]>='a'&&save[i]<='z')
mystack.push(i);
else
{
int templeft,tempright;
tempright=mystack.top(); //注意显示right,后是left
mystack.pop();
templeft=mystack.top();
mystack.pop();
tree[i].left=templeft;
tree[i].right=tempright;
tree[templeft].father=tree[tempright].father=i;
mystack.push(i);
}
}
int root;
for(int i=0;i<n;i++) //找到树根
{
if(tree[i].father==-1)
{
root=i;
break;
}
}
queue<int>myqueue; //先BFS遍历一遍,按顺序保存,然后输出
int len=0;
myqueue.push(root);
while(!myqueue.empty())
{
int cur=myqueue.front();
myqueue.pop();
ans[len++]=save[cur];
if(tree[cur].left!=-1) //判断否有左孩子
myqueue.push(tree[cur].left);
if(tree[cur].right!=-1) //判断是否有右孩子
myqueue.push(tree[cur].right);
}
for(int i=len-1;i>=0;i--) //逆序输出
putchar(ans[i]);
putchar('\n');
}
return 0;
}