Bootstrap

复习系列1-DS队列--组队列

DS队列--组队列

这题我还是WA了几次,一开始没注意要考虑不同组的顺序,以为按顺序输出;其次是最后一个输出后面没有空格,格式错误又WA了几发,确实不应该。为了方便,最后直接再加一个队列输出,解决格式问题,整个程序用了不少队列,还顺带复习了一下 map,感觉还有更好的方法。不过第一阶段以复习语法为主,细节就不深究了。

此外,期末A题的时候还是不要写private了,节省时间,(平时写代码习惯了,有点难改,接下来会尽量改一改习惯,为期末更快A完做准备)。

题目描述

组队列是队列结构中一种常见的队列结构,在很多地方有着广泛应用。组队列是是指队列内的元素分组聚集在一起。组队列包含两种命令:

1、 ENQUEUE,表示当有新的元素进入队列,首先会检索是否有同一组的元素已经存在,如果有,则新元素排在同组的最后,如果没有则插入队列末尾。

2、 DEQUEUE,表示队列头元素出队

3、 STOP,停止操作

建议使用C++自带的队列对象queue,编程更方便

输入

第1行输入一个t(t<=10),表示1个队列中有多少个组

第2行输入一个第1组的元素个数和数值

第3行输入一个第2组的元素个数和数值

以此类推输入完t组以定义同组元素之后,开始输入多个操作命令(<200),对空的组队列进行操作,例如输入ENQUEUE 100,表示把元素100插入队列

输出

DEQUEUE出队的元素

样例输入

2

3 101 102 103

3 201 202 203

ENQUEUE 101

ENQUEUE 201

ENQUEUE 102

ENQUEUE 202

ENQUEUE 103

ENQUEUE 203

DEQUEUE

DEQUEUE

DEQUEUE

STOP

样例输出

101 102 103

Solution:

import java.util.*;

/**
 * @author: Liu Canbin
 * @date: 2019/1/2
 */

public class Main {
    private static Queue[] queues;
    private static Queue queueGroup;
    private static Queue queueOutput;
    public static void main(String[] args) {
        Map map = new HashMap();
        Scanner scanner = new Scanner(System.in);
        int group = scanner.nextInt();
        queues = new Queue[group];
        for (int i = 0; i < group; i++) {
            queues[i] = new LinkedList();
            int n = scanner.nextInt();
            for (int j = 0; j <n ; j++) {
                map.put(scanner.next(),i);
            }
        }
        queueGroup = new LinkedList();//根据先后顺序给所有组别一个队列
        queueOutput = new LinkedList();
       while (true){
           String operator = scanner.next();
           if (operator.equals("ENQUEUE")){
               String element = scanner.next();
               int index = (Integer) (map.get(element));
               queueGroup.offer(index);
               queues[index].offer(element);
           }else if (operator.equals("DEQUEUE")){
               int index = (Integer) queueGroup.peek();
               queueOutput.offer(queues[index].poll());
               if (queues[index].isEmpty()){
                   queueGroup.poll();
               }
           }else {//STOP
               int size = queueOutput.size();//避免重复计算
               for (int i = 0; i <size; i++) {
                   System.out.print(queueOutput.poll());
                   if (i!=size-1){
                       System.out.print(" ");
                   }
               }
               break;
           }
       }
    }
}

 

;