【数据结构五】队列和Queue详解

目录

队列

1.模拟实现一个队列

2.Queue的基本使用

3.循环队列详解

4.双端队列详解

5.分别用栈实现队列,队列实现栈


队列

队列 :只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为 队尾( Tail/Rear 出队列:进行删除操作的一端称为队头( Head/Front

1.模拟实现一个队列

队列中存储结构需要用到空间类型的数据结构,这里我们回顾一下什么是数据结构,数据结构**研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,**其中物理结构即顺序结构和链式结构,因为队列的使用情况多为增加和删除,很少查询,所以我们使用链表来实现一个自己的队列。

java 复制代码
public class MyQueue {
    class ListNode {
        int val;
        ListNode next;

        public ListNode(int val) {
            this.val = val;
        }
    }

    private int usedsize;
    ListNode head;
    ListNode last;

    public MyQueue() {
        usedsize = 0;
        head = last = null;
    }

    public boolean offer(int val) {
        ListNode cur = new ListNode(val);
        if (usedsize == 0) {
            head = last = cur;
            usedsize++;
            return true;
        } else {
            last.next = cur;
            last = cur;
            usedsize++;
            return true;
        }
    }
    public int poll(){
        ListNode cur=head;
        head=head.next;
        usedsize--;
        return cur.val;
    }
    public int peek(){
        return head.val;
    }
    public int size(){
        return usedsize;
    }
    public boolean isEmpty(){
        return usedsize==0;
    }
}

2.Queue的基本使用

在java中,Queue是个接口,底层是通过链表实现的,下面是Queue提供的方法

因为Queue是接口,不能直接实例对象,所以创建对象时需要借助LinkedList,如下:

java 复制代码
Queue<Integer> q = new LinkedList<>();

3.循环队列详解

循环队列,即首尾相连的队列,如下所示:

在基于顺序结构实现的队列中,数组头部排出数据后,空间便不能在被使用,循环队列的一个好处是我们可以利用这个队列之前用过的空间。

循环队列的设计需要注意几点:

1.如何实现循环:

通过设置front,rear两个前后,指针,每次增加或删除数据通过(front/rear+1)%arr.length即可。

2.需要注意当front==rear时,该队列为空

3.如何辨别队列是否满:

  • 可以通过设置size,size等于数组长度则满
  • 保留一个空位置,rear+1=front时,队列满

下面是一道设计循环队列的oj题,大家可以趁热打铁:

设计循环队列

4.双端队列详解

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

**与Queue一样,Deque在Java中是一个接口。**在实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口。

java 复制代码
Deque<Integer> stack = new ArrayDeque<>();//双端队列的线性实现
Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现

5.分别用栈实现队列,队列实现栈

来自力扣的两道算法题

1.用队列实现栈

2.用栈实现队列

相关推荐
和编程干到底1 小时前
数据结构 栈和队列、树
数据结构·算法
爱编程的化学家2 小时前
代码随想录算法训练营第十一天--二叉树2 || 226.翻转二叉树 / 101.对称二叉树 / 104.二叉树的最大深度 / 111.二叉树的最小深度
数据结构·c++·算法·leetcode·二叉树·代码随想录
shan&cen3 小时前
Day04 前缀和&差分 1109. 航班预订统计 、304. 二维区域和检索 - 矩阵不可变
java·数据结构·算法
屁股割了还要学4 小时前
【数据结构入门】排序算法(4)归并排序
c语言·数据结构·学习·算法·排序算法
Chance_to_win4 小时前
数据结构之顺序表
数据结构
lifallen5 小时前
字节跳动Redis变种Abase:无主多写架构如何解决高可用难题
数据结构·redis·分布式·算法·缓存
MMjeaty5 小时前
map/multimap容器
数据结构·c++
zstar-_5 小时前
【不背八股】12.十大排序算法
数据结构·算法·排序算法
吃着火锅x唱着歌6 小时前
LeetCode 2110.股票平滑下跌阶段的数目
数据结构·算法·leetcode
疋瓞6 小时前
C++_STL和数据结构《1》_STL、STL_迭代器、c++中的模版、STL_vecto、列表初始化、三个算法、链表
数据结构·c++·算法