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