JAVA基础 队列

排队取奶茶

时间限制:1.000S  空间限制:128MB

题目描述

假设有一家奶茶店,现在有一些人在排队等待取奶茶,同时也有人在取奶茶。 请你设计一个程序模拟这种情况下的奶茶队列管理。

假设每个人取奶茶的时间非常短,可以忽略不计,只需要考虑队列中的操作。 

队列操作说明: 

1. 当操作为 1 时,表示有人已经取走奶茶,从队列中删除该人的信息。
2. 当操作为 2 时,表示有新人加入排队,将该人的信息加入队列。 

在一系列操作之后,你需要回答:下一个取奶茶的人是谁?

输入描述

第一行有一个整数 n,代表初始队列有 n 个人。 

第二行有 n 个字符串,代表当前奶茶队列中的人。 

第三行为一个整数 m,代表接下来将会有 m 次操作。 

接下来一共有 m 行,代表共有 m 次操作。 

如果是操作 1,那么该行只会有一个数字,代表有人取走了奶茶。
如果是操作 2,那么该行有一个数字和一个字符串,第一个数字 2 表示有人加入了奶茶队列,第二个字符串代表新加入的奶茶队列的人。

输出描述

输出只有一行,为下一个取奶茶的人。 如果已经没有去奶茶的人了,输出“There are no more people in the queue.”。

输入示例
5
Giselle Winter Aubree Wrenley Royalty
3
1
1
2 Andrew
输出示例
Aubree

 

JAVA代码实现:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Queue queue = new LinkedList<>();

        // 将输入的元素依次加入队列
        for (int i = 0; i < n; i++) {
            queue.add(sc.next());
        }

        int m = sc.nextInt();
        int opt;
        for (int i = 0; i < m; i++) {
            opt = sc.nextInt();
            if (opt == 1 && !queue.isEmpty()) {
                // 如果opt为1且队列不为空,则移除队头元素
                queue.poll();
            } else {
                // 否则,将输入的元素加入队列
                queue.add(sc.next());
            }
        }

        if (queue.isEmpty()) {
            System.out.println("There are no more people in the queue.");
        } else {
            System.out.println(queue.poll()); // poll()操作取出队头元素
        }
    }
}

队列,顾名思义,和排队的队列结构是类似的,在排队的过程中,想要加入队列,需要在队伍的最后一位(也被称为队尾)入队,想要离开队列,需要从队伍的第一位(也被称为队头)出队。

JAVA基础 队列_第1张图片

从图中可以看出,队列在队尾那一侧进行插入操作(入队),在队头那一侧进行删除操作(出队),而且是先进先出FIFO(最先进入队列的元素将首先被移除)。

队列在计算机领域中应用也十分广泛,比如在网络通信中,请求和响应通常以队列的形式进行排队,以确保数据按照正确的顺序进行传输,又比如说不同进程可以通过消息队列来传递数据和消息。

除了队列之外,还有双端队列这种数据结构,双端队列允许在队列的两端(前端和后端)都能进行插入(添加元素)和删除(移除元素)操作,结合了队列(先进先出,FIFO)和栈(后进先出,LIFO)的特性,因此可以使用双端队列来实现队列这种结构,这使得它拥有更多的应用场景。

队列的操作

在Java中想要创建队列,通常需要导入 java.util.Queue 接口,然后选择具体的队列实现类(例如 ArrayDeque 或 LinkedList)来创建队列对象。

 LinkedList 除了用来实现链表之外,也可以用来实现栈或队列,如果你的主要操作是在队列的两端进行添加和删除操作,使用ArrayDeque 更合适。如果你需要在队列中间频繁插入和删除元素,LinkedList 更适合。

  • java.util.Queue:队列接口,定义了队列的基本操作。

  • java.util.LinkedList:使用链表实现的队列,实现了Queue接口。

  • java.util.ArrayDeque:使用数组实现的双端队列,同样也实现了Queue接口。

import java.util.Queue;
import java.util.ArrayDeque; // 如果要使用 ArrayDeque 实现队列
import java.util.Queue;
import java.util.LinkedList; // 如果要使用 LinkedList 实现队列

对应的,创建队列也有两种方式

Queue queue = new LinkedList<>(); // 使用LinkedList实现队列

Queue queue = new ArrayDeque<>(); // 使用ArrayDeque实现队列

队列的常用操作主要有以下几种:

  • isEmpty(): 判断队列是否为空,如果队列为空返回true, 否则返回false
  • add(): 入队操作,将新的元素添加到队列的尾部。
  • poll(): 出队操作,获取并移除队列的头部元素。
  • peek(): 访问队列的头部元素,但不会将其移除。
  • size(): 获取队列的长度,即队列中元素的数量。
queue.add("Jack"); 
queue.add("Mike"); // 入队了两个名称字符串

String name = queue.poll(); // 移除队列头部的元素

String name = queue.peek(); // 获取队列头部的元素但是不会将其移除,如果队列为空,返回null

boolean isEmpty = queue.isEmpty(); //  如果队列为空,返回true;否则返回false

int queueSize = queue.size(); // 获取队列中元素的数量

你可能感兴趣的:(JAVA基础学习,java,算法,开发语言)