网易有道编程题:恢复队列(C++)

来源:互联网 发布:天湖ipv6网络电视 编辑:程序博客网 时间:2024/06/17 21:50

题目:

小明同学把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。现在小明想让你构造出原始的队列,你能做到吗?

输入描述:

第一行一个整数T(T ≤ 100)表示数据组数,每组数据输入一个数n(1 ≤ n ≤ 100000),输入的所有n之和不超过200000。

输出描述:

对于每组数据,输出一行,表示原始的队列。数字之间用一个空格隔开,不要在行末输出多余的空格.

输入例子:

4
1
2
3
10

输出例子:

1
2 1
2 1 3
8 1 6 2 10 3 7 4 9 5

答案:

#include<iostream>using namespace std;int main() {    //输入T    int T=0;    cin>>T;    while (T--) {        int n;        cin>>n;//输入n        int *a = new int[n+1];        a[0]=0;        //原始输出队列:1,2,...,n        for (int i=1; i<=n; i++) {            a[i]=i;        }        //还原队列(原理类似插入排序)        for (int i=0; i<n-1; i++) {            a[0]=a[n];            int k = n;            for (int j=0; j<=i; j++) {                a[k]=a[k-1];                k--;            }            a[k]=a[0];        }        //输出还原的队列        int i;        for (i=1; i<n; i++) {            cout<<a[i]<<" ";        }        cout<<a[i]<<endl;    }}

结果:

这里写图片描述

2 0
原创粉丝点击