数据结构复习笔记系列3 — 队列

Posted Putarmor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构复习笔记系列3 — 队列相关的知识,希望对你有一定的参考价值。

1.队列定义

队列:只允许在一端进行数据插入操作,在另外一端进行数据删除操作的特殊线性表,具有先入先出的特点。进行插入操作的一端称为队尾(tail/rear),进行删除操作的一端称为队头(head/front)。举个例子来说,就像我们平时买东西一样,排的队就可以看作一个队列。

2.手动实现循环队列

1)实现队列方式

队列可以用链表也可以用数组去实现,用链表实现表现更优一点,当使用数组时,因为队列先进先出的特性,删除元素时,其余元素都要整体移动,这样时间复杂度会达到O(n)。

2)集合中队列继承体系

根据Java集合体系来看,LinkedList类实现了Deque(双端队列)接口,而Deque接口又继承了Queue(普通队列)接口,也就是说LinkedList类既可以当双端队列去使用,也可以当普通队列去使用。

3)LinkedList源码

底层采用双向链表实现
add方法调用linklast方法,offer调用add方法,推荐使用offer添加元素;offer满了后返回false;而add满了后会抛出异常。

linklast是是尾巴插法

class MyCircularQueue
    private int front;
    private int rear; //代表队尾也代表当前可以存放元素的下标
    private int[] elem;

    public MyCircularQueue(int k)
        this.elem = new int[k];
    

    //入队
    public boolean enQueue(int value)
        if(isFull())
            return false;
        
        //放到rear下标,rear向后走
        this.elem[rear] = value;
        rear = (rear+1)%this.elem.length;
        return true;
    

    //出队
    public boolean deQueue()
        if(isEmpty())
            return false;
        
        //移动front下标就可以了
        front = (front+1)%this.elem.length;
        return true;
    

    //得到队头元素
    public int Front()
        if(isEmpty())
            return -1;
        
        return this.elem[front];
    

    //得到队尾元素  .....比较重要
    public int Rear()
        if(isEmpty())
            return -1;
        
        return this.elem[(rear-1+this.elem.length)%this.elem.length];
    

    //判空
    public boolean isEmpty()
        if(front == rear)
            return true;
        
        return false;
    

    //判满,基于数组所以要判满
    public boolean isFull()
        if((rear+1)%this.elem.length == front)
            return true;
        
        return false;
    

以上是关于数据结构复习笔记系列3 — 队列的主要内容,如果未能解决你的问题,请参考以下文章

数据结构复习笔记——队列(c语言)

计算机网络复习笔记

计算机网络复习笔记

数据结构复习笔记系列2 — 栈

数据结构复习笔记系列2 — 栈

2023数据结构考研复习-栈队列和数组