题目描述:
CLZ 银行只有两个接待窗口,VIPVIP 窗口和普通窗口,VIPVIP 用户进入 VIPVIP 窗口排队,剩下的进入普通窗口排队。现有 MM 次操作,操作有四种类型,如下:
IN name V:表示一名叫 name 的用户到 VIPVIP 窗口排队
OUT V:表示 VIPVIP 窗口队头的用户离开排队
IN name N:表示一名叫 name 的用户到普通窗口排队
OUT N:表示普通窗口队头的用户离开排队
求 MM 次操作结束后 VIPVIP 窗口队列和普通窗口队列中的姓名。
输入描述
第一行是一个整数 M(1\leq M \leq 1000)M(1≤M≤1000),表示一共有 MM 次操作。
第二行到第 M+1M+1 行输入操作,格式如下:
IN name V
OUT V
IN name N
OUT N
输出描述
输出 MM 次操作后 VIPVIP 窗口队列和普通窗口队列中的姓名(从头到尾),先输出 VIPVIP 窗口队列后输出普通窗口队列。
输入输出样例
示例 1
输入
5
IN xiaoming N
IN Adel V
IN laozhao N
OUT N
IN CLZ V
copy
输出
Adel
CLZ
laozhao
题目分析:1.由于有两种模式(vip和putong),所以需要建立连个队列,一个是vip,一个putong,由于首先输入一个数字开始换行操作,并且每行输入之后都会进行换行操作,所以我们需要进行换行操作(sc.nextLine()
)(进行吸收换行操作);
2.输入操作次数m之后会有m行的字符串输入,并且我们需要知道这行字符串中每段字符是什么,所以我们需要把字符串分割,并且把字符串分隔成数组之后提取出每段的字符进行比较;这里可以用到str[0].contains("V")
;
代码如下:
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Queue<String> vip = new LinkedList<>();
Queue<String> putong = new LinkedList<>();
int m = sc.nextInt();
sc.nextLine();
while(m-->0){
String s = sc.nextLine();
String[] str = s.split(" ");
if(str[0].contains("IN")){
if(str[2].contains("N")){
putong.offer(str[1]);
}else{
vip.offer(str[1]);
}
}else{
if(str[1].contains("N")){
putong.poll();
}else{
vip.poll();
}
}
}
for(String s : vip){
System.out.println(s);
}
for(String s : putong){
System.out.println(s);
}
}
}
对于队列:
思考一下:
为什么链式存储的方式的队列首尾指针与链表头尾刚好相反,是什么原因呢?
其实我们知道链表的表头是用来插入数据的,表尾处的数据才是最先插入的,先入先出原则,所以表尾出的数据最先出列,也就是队列的头啦!听到这里,可能有人迷糊了,什么头什么尾的?链表是数据存储的组织方式,他只是决定了数据在内存中怎么存储,而队列是说我们是按照什么顺序存储。可以理解为一群人排队,队列告诉他们先来的先吃饭,后来的得排队,而链表或顺序表是说,你可以站着排队蹲着排队等等。
对于java 里面for (String str : s){}怎么理解