队列理解及队列的模拟实现

概念

队列:只允许在一端进行 插入操作, 在 另一端进行删除操作。仍然是一种 特殊的线性表 ,队列具有 先进先出 的特性。
进行插入操作的一端称为 队尾(rear)
进行删除操作的一端称为 队头(front)

  • 图示:
    ![[Pasted image 20231012163930.png]]

队列的使用

  • 在Java中,Queue是个接口,底层是通过链表实现的。所以在使用时,必须实例化LinkedList的对象
    ![[Pasted image 20231012164028.png]]

队列的模拟(链表实现)

  • 图解:
    ![[Pasted image 20231013212739.png]]
    ![[Pasted image 20231013212748.png]]

1. 入队列:offer

// 入队列  
public void offer(int data) {  
    // 1.尾插  
    LinkedListNode node = new LinkedListNode(data);  
    if (head == null) {  
        head = node;  
        last = node;  
    } else {  
        last.next = node;  
        node.prev = last;  
        last = node;  
    }  
    size++;  
}

2. 出队列

  • 即删除头结点

思路

  • 如果链表为空,返回null
  • 如果链表只有一个结点,首尾指针置空
  • 链表有多个结点,将头结点与其下一个结点 相断连接
// 出队列  
public void poll() {  
    // 即删除头结点  
    // 1.如果链表为空,无法删除  
    if (head == null) {  
        return;  
    }else if (head == last) {  
        // 2.如果链表只有一个结点  
        head = null;  
        last = null;  
    }else {  
        // 3.链表有多个结点  
        head = head.next;  
        head.prev.next = null;  
        head.prev = null;  
    }  
    size--;  
}

3. 获取队头元素

  • 返回头结点数据即可
// 获取队头元素  
public int peek() {  
    if (head == null) {  
        throw new RuntimeException("链表为空,无法获取");  
    }  
    return head.val;  
}

4. 返回链表长度

  • 因为我们已经定义了一个 size 用于表示链表长度,直接返回 size 即可
// 获取链表长度  
public int size() {  
    return size;  
}

5. 判断队列是否为空

  • 判断 size 是否为 0 或者 判断头结点是否为空
public boolean isEmpty() {  
    // return head == null;  
    return size == 0;  
}

双端队列(Deque)

概念

双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。
那就说明元素可以从队头出队和入队,也可以从队尾出队和入队

![[Pasted image 20231014155049.png]]

Deque是一个接口,使用时必须创建LinkedList的对象

说明:

  • 双端队列用法与本章所模拟的队列用法是相同的,只不过更灵活,不作过多赘述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行舟Yi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值