• 数据结构 | (四) Queue


    队列 :只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为 队尾( Tail/Rear 出队列:进行删除操作的一端称为 队头 Head/Front
    Java 中, Queue 是个接口,底层是通过链表实现
    方法功能
    boolean offer(E e)入队列
    E poll()出队列
    peek()获取队头元素
    int size()获取队列中有效元素个数
    boolean isEmpty()检测队列是否为空

    注意: Queue 是个接口,在实例化时必须实例化 LinkedList 的对象,因为 LinkedList 实现了 Queue 接口。
    队列的模拟实现

    1. public class Queue {
    2. // 双向链表节点
    3. public static class ListNode{
    4. ListNode next;
    5. ListNode prev;
    6. int value;
    7. ListNode(int value){
    8. this.value = value;
    9. }
    10. }
    11. ListNode first; // 队头
    12. ListNode last; // 队尾
    13. int size = 0;
    14. // 入队列---向双向链表位置插入新节点
    15. public void offer(int e){
    16. ListNode newNode = new ListNode(e);
    17. if(first == null){
    18. first = newNode;
    19. // last = newNode;
    20. }else{
    21. last.next = newNode;
    22. newNode.prev = last;
    23. // last = newNode;
    24. }
    25. last = newNode;
    26. size++;
    27. }
    28. // 出队列---将双向链表第一个节点删除掉
    29. public int poll(){
    30. // 1. 队列为空
    31. // 2. 队列中只有一个元素----链表中只有一个节点---直接删除
    32. // 3. 队列中有多个元素---链表中有多个节点----将第一个节点删除
    33. int value = 0;
    34. if(first == null){
    35. return null;
    36. }else if(first == last){
    37. last = null;
    38. first = null;
    39. }else{
    40. value = first.value;
    41. first = first.next;
    42. first.prev.next = null;
    43. first.prev = null;
    44. }
    45. --size;
    46. return value;
    47. }
    48. // 获取队头元素---获取链表中第一个节点的值域
    49. public int peek(){
    50. if(first == null){
    51. return null;
    52. }
    53. return first.value;
    54. }
    55. public int size() {
    56. return size;
    57. }
    58. public boolean isEmpty(){
    59. return first == null;
    60. }
    61. }
    循环队列
    如何区分空与满
    • 通过添加 size 属性记录
    • 保留一个位置
    • 使用标记
    双端队列 (Deque)
    双端队列( deque )是指允许两端都可以进行入队和出队操作的队列, deque “double ended queue” 的简称。 那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。
    Deque 是一个接口,使用时必须创建 LinkedList 的对象。
    在实际工程中,使用 Deque 接口是比较多的,栈和队列均可以使用该接口。
    1. Deque stack = new ArrayDeque<>();//双端队列的线性实现
    2. Deque queue = new LinkedList<>();//双端队列的链式实现

  • 相关阅读:
    Zig实现Hello World
    vue3移动端嵌入pdf的两种办法
    测试平台系列(92) 让http请求支持文件上传
    基于SpringBoot的家电销售电商管理平台
    数据库的基本操作(期末复习大全)
    Cadence Allegro PCB设计88问解析(十九) 之 Allegro中文字大小设置
    Java提高与实践
    Docker从入门到进阶之进阶操作(2) —— 什么是Dockerfile?
    fastapi项目结构以及多进程部署
    海思Hi3519DV500边缘计算盒子-英码IVP09A,双核A55 64位处理器
  • 原文地址:https://blog.csdn.net/khh1014173041/article/details/133685096