题目描述
CLZ 银行只有两个接待窗口,VIP 窗口和普通窗口,VIP 用户进入 VIP 窗口排队,剩下的进入普通窗口排队。现有 M次操作,操作有四种类型,如下:
IN name V:表示一名叫 name 的用户到 VIP 窗口排队
OUT V:表示 VIP 窗口队头的用户离开排队
IN name N:表示一名叫 name 的用户到普通窗口排队
OUT N:表示普通窗口队头的用户离开排队
求 M次操作结束后 VIP 窗口队列和普通窗口队列中的姓名。
输入描述
第一行是一个整数 M(1≤M≤1000),表示一共有 M次操作。
第二行到第 M+1行输入操作,格式如下:
IN name V
OUT V
IN name N
OUT N
输出描述
输出 M 次操作后 VIP 窗口队列和普通窗口队列中的姓名(从头到尾),先输出 VIP 窗口队列后输出普通窗口队列
做题思路:我们看到题目中银行队列出队和进队很容易让我们联想到Java里面的Queue队列问题,这里的题目中其实主要的是包含了两个队列,并且每一次的出队和进队都是在队头和队尾实现的,所以我们只需要运用好队列加上判断就可以实现解题。
回顾一下Java里面队列的知识:
部分成员函数(包括继承的):
add()
: 增加一个元索,如果队列已满,则抛出一个异常remove()
:移除并返回队列头部的元素,如果队列为空,则抛出一个异常element()
:返回队列头部的元素,如果队列为空,则抛出一个异常offer()
:添加一个元素并返回true
,如果队列已满,则返回false
poll()
: 移除并返问队列头部的元素,如果队列为空,则返回null
peek()
: 返回队列头部的元素,如果队列为空,则返回null
put()
: 添加一个元素, 如果队列满,则阻塞take()
: 移除并返回队列头部的元素,如果队列为空,则阻塞size()
: 返回队列长度
步骤一:我们可以定义两个队列一个表示VIP队列一个表示普通用户的队列,然后输出一个整数关于M次的操作:
Queue<String> VIP=new LinkedList<>();
Queue<String> Normal=new LinkedList<>();
步骤二:运用for循环来进行计算每一次M的操作:
2.1首先判断用户是需要出队还是入队,再判断哪一个队列
2.2最后我们使用对应的队列中的方法将队列进行操作即可
for (int i = 0; i < M; i++) {
String name,type,caozuo;
caozuo=scanner.nextLine();
String[] s=caozuo.split(" ");
if(s[0].contains("IN")){
name=s[1];
type=s[2];
if(type.contains("V")){
VIP.offer(name);
}
else {
Normal.offer(name);
}
}
else if (s[0].contains("OUT")){
if(s[1].contains("V")){
VIP.poll();
}
else {
Normal.poll();
}
}
}
步骤三:我们的M次操作已经完成,最后我们只需要,将队列一行一行的输出即可,在输出队列的时候我们可以使用队列中poll()的方法,移除每一个元素并且返回该元素,这样子输出每一个元素就可以达到逐个输出的效果:
while (!VIP.isEmpty()) {
System.out.println(VIP.poll());
}
while (!Normal.isEmpty()) {
System.out.println(Normal.poll());
}
scanner.close();
完整的代码如下:
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
Queue<String> VIP=new LinkedList<>();
Queue<String> Normal=new LinkedList<>();
int M= scanner.nextInt();
scanner.nextLine();
for (int i = 0; i < M; i++) {
String name,type,caozuo;
caozuo=scanner.nextLine();
String[] s=caozuo.split(" ");
if(s[0].contains("IN")){
name=s[1];
type=s[2];
if(type.contains("V")){
VIP.offer(name);
}
else {
Normal.offer(name);
}
}
else if (s[0].contains("OUT")){
if(s[1].contains("V")){
VIP.poll();
}
else {
Normal.poll();
}
}
}
// 输出剩余的VIP和普通客户
while (!VIP.isEmpty()) {
System.out.println(VIP.poll());
}
while (!Normal.isEmpty()) {
System.out.println(Normal.poll());
}
scanner.close();
}