Java基础课 | 排队去奶茶(队列)

本文介绍了Java中队列和双端队列的概念,重点讲解了如何使用LinkedList和ArrayDeque在模拟奶茶店排队系统中进行操作,包括添加和删除元素。最后提供了示例程序来处理顾客加入和离开队列的逻辑。
摘要由CSDN通过智能技术生成

Java基础课 | 排队去奶茶(队列)

Java基础


队列

概念

类似排队
在这里插入图片描述

特点

队列在队尾一侧插入(入队),在队头一侧删除(出队)。先进先出 FIFO(最先进入队列的元素将首先被移除)。

队列在计算机领域的应用:如

  • 网络通信中,请求和响应通常以队列的形式进行排队,以确保数据按照正确的顺序进行传输。
  • 不同进程可以通过消息队列来传递数据和消息。

双端队列

允许在队列的两端都能进行插入(添加元素)和删除(移除元素)操作,结合了队列(先进先出,FIFO)和栈(后进先出,LIFO)的特性。

操作

在Java中创建队列,首先导入

  • java.util.Queue:队列接口,定义了队列的基本操作
    然后选择具体的队列实现类
  • java.util.LinkedList:使用链表实现的队列,实现了Queue接口
  • java.util.ArrayDeque:使用数组实现的双端队列,也实现了Queue接口

LinkedList除了用于实现链表,也可以用于实现栈或队列。

  • 在队列两端进行添加和删除操作,用 ArrayDeque
  • 在队列中间频繁插入和删除元素,用LinkedList

队列的常用操作

  • isEmpty():判断队列是否为空
  • add():入队操作,将新的元素添加到队列的尾部
  • poll():出队操作,获取并移除队列的头部元素
  • peek():访问队列的头部元素,但不会将其移除
  • size():获取队列的长度,即队列中元素的数量

Queue 接口中的 add() 方法和 ArrayDequeaddLast() 都用于将指定的元素添加到队列的末尾,但addLast()做了异常处理,对于有界队列(就是长度限定的队列)来说,如果队列已经满了,再添加元素,add方法会抛出异常,而addLast不会抛出异常,但会返回false

当删除数据结构中的元素时,都应该考虑结构中元素是否已经为空的情况

题目


题目描述
假设有一家奶茶店,现在有一些人在排队等待取奶茶,同时也有人在取奶茶。 请你设计一个程序模拟这种情况下的奶茶队列管理。
假设每个人取奶茶的时间非常短,可以忽略不计,只需要考虑队列中的操作。
队列操作说明:
1、当操作为 1 时,表示有人已经取走奶茶,从队列中删除该人的信息。
2、当操作为 2 时,表示有新人加入排队,将该人的信息加入队列。
在一系列操作之后,你需要回答:下一个取奶茶的人是谁?

输入描述
第一行有一个整数 n,代表初始队列有 n 个人。
第二行有 n 个字符串,代表当前奶茶队列中的人。
第三行为一个整数 m,代表接下来将会有 m 次操作。
接下来一共有 m 行,代表共有 m 次操作。
如果是操作 1,那么该行只会有一个数字,代表有人取走了奶茶。
如果是操作 2,那么该行有一个数字和一个字符串,第一个数字 2 表示有人加入了奶茶队列,第二个字符串代表新加入的奶茶队列的人。

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

程序编写


import java.util.Queue;
import java.util.ArrayDeque;
import java.util.Scanner;

public class Main {
    public static void main (String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        int n = scanner.nextInt();
        ArrayDeque<String> queue = new ArrayDeque();
        for (int i = 0; i < n; i++) {
            queue.add(scanner.next());
        }
        
        int m = scanner.nextInt();
        for (int i = 0; i < m; i++) {
            if (scanner.nextInt() == 1) {
                if (!queue.isEmpty()) {
                    queue.poll();
                } else {
                    continue;
                }
            } else {
                queue.add(scanner.next());
            }
        }
        
        if (!queue.isEmpty()){
            System.out.println(queue.peek());
        } else {
            System.out.println("There are no more people in the queue.");
        }
        scanner.close();
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值