• 数据结构 | (四) 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<>();//双端队列的链式实现

  • 相关阅读:
    【无线传感器】使用 Mamdani 模糊推理系统改进无线传感器网络路由和数据包传递(Matlab代码实现)
    融云直播 SDK 玩法翻新,入围信通院「实时互动创新应用优秀案例」
    利用游标给数据库所有表添加同一个字段
    win10禁止IE跳转到edge
    思科Etherchannel
    sharding-jdbc自定义查询(范围查询)案例&&查询时可能会踩的坑
    Redis分布式锁
    TI的单芯片毫米波雷达传感器配置命令是如何传递到DSP和ARM核的?(串口程序代码走读)
    【面试普通人VS高手系列】lock和synchronized区别
    K8s源码分析(一)-K8s调度框架及调度器初始化介绍
  • 原文地址:https://blog.csdn.net/khh1014173041/article/details/133685096