构造队列

来源:互联网 发布:淘宝怎么投诉药店 编辑:程序博客网 时间:2024/05/24 05:04

Question

小明同学把1到n这n个数字按照一定的顺序放入了一个队列Q中。现在他对队列Q执行了如下程序:

while(!Q.empty())            //队列不空,执行循环{    int x=Q.front();         //取出当前队头的值x    Q.pop();                 //弹出当前队头    Q.push(x);               //把x放入队尾    x = Q.front();           //取出这时候队头的值    printf("%d\n",x);        //输出x    Q.pop();                 //弹出这时候的队头}

做取出队头的值操作的时候,并不弹出当前队头。
小明同学发现,这段程序恰好按顺序输出了1,2,3,…,n。现在小明想让你构造出原始的队列,你能做到吗?

Algorithm

可以逆向考虑,举个例子n=3时
2,1,3
根据上面的步骤:
1、把队头2取出,并弹出队头 1,3
2、把2放入队尾 1,3,2
3、取出当前队头1,并弹出队头 3,2 输出1

剩下队列为3,2
重复上面的步骤 输出2
重复上面的步骤 输出3

逆过程应该是
把队尾元素取出,并弹出,放入队头,插入元素

Code

#include<iostream>#include<vector>#include<deque>using namespace std;int main(){    int T;    while(cin>>T){        for(int t=0;t<T;t++){            int n;            cin>>n;            deque<int> d;            for(int i=n;i>=1;i--){                d.push_front(i);                int tmp = d.back();                d.pop_back();                d.push_front(tmp);            }            for(int i=0;i<n;i++){                if(i==n-1)                    cout<<d[i]<<endl;                else                    cout<<d[i]<<' ';            }        }    }    return 0;}
原创粉丝点击