数据结构复习笔记系列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;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值