数据结构 + BFS uva 11234 - Expressions

来源:互联网 发布:网络教育什么专业好 编辑:程序博客网 时间:2024/05/17 00:50

 

题目链接:

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 11000using 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;}


 

 

原创粉丝点击