构造队列问题(循环队列变形java)

来源:互联网 发布:编程菱形 编辑:程序博客网 时间:2024/05/24 04:30

1、牛客网原题:

题目描述

小明同学把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。现在小明想让你构造出原始的队列,你能做到吗?[注:原题样例第三行5有错,应该为3,以下已修正]

输入描述:

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

输出描述:

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

输入

412310

输出

12 12 1 38 1 6 2 10 3 7 4 9 5


2、code:已a

package schooloffer17;import java.util.Scanner;/** * Created by caoxiaohong on 17/11/5 13:27. * 小明同学把1到n这n个数字按照一定的顺... * <构造队列></构造队列> */public class BuildQueue {    public static void main(String[] args) {        Scanner scanner=new Scanner(System.in);        int T=scanner.nextInt();        int n;        while (T-->0){            n=scanner.nextInt();            int[] numbers=new int[n];            int num=1;//插入数字            boolean isFind=false;//标识当前弹出元素前面,是否找到一个插入到队尾的元素,只有找到,才能弹出.            for(int i=0;num<=n;i%=n){                if(isFind==false && numbers[i]==0){                    isFind=true;                    i++;                }else if(isFind==false && numbers[i]!=0){                    i++;                }else if(isFind==true && numbers[i]!=0){                    i++;                }else if(isFind==true && numbers[i]==0){                    numbers[i]=num++;                    isFind=false;                    i++;                }            }            //输出            for(int i=0;i<n;i++){                if(i<n-1)                    System.out.print(numbers[i]+" ");                else                    System.out.println(numbers[i]);            }        }    }}



原创粉丝点击