首页 > 其他分享 >数据结构 玩转数据结构 3-7 循环队列的实现

数据结构 玩转数据结构 3-7 循环队列的实现

时间:2022-10-27 07:11:05浏览次数:116  
标签:10 capacity 队列 LoopQueue 玩转 front return 数据结构 size

0    课程地址

https://coding.imooc.com/lesson/207.html#mid=13424

 

1    重点关注

1.1    循环队列代码实现(出队复杂度为O(1))

见3.1

 

2    课程内容


 

3    Coding

3.1    循环队列代码实现  重点:

 /**
     * 循环队列入队 队尾插入元素
     * @author weidoudou
     * @date 2022/10/23 17:49
     * @param e 请添加参数描述
     * @return void
     **/
    @Override
    public void enQueue(E e) {
        //1 判断队列是否是满的,满的话进行扩容
        if((tail+1)% data.length==front){
            //扩容操作
            enSize(getCapacity()*2);
        }

        //2 队尾插入元素
        data[tail] = e;
        tail = (tail+1)% data.length;
        size++;
    }

    /**
     * 扩容操作
     * @author weidoudou
     * @date 2022/10/23 17:55
     * @param newCapacity 请添加参数描述
     * @return void
     **/
    private void enSize(int newCapacity){
        E[] newData = (E[]) new Object[newCapacity+1];
        for(int i = 0;i<size;i++){
            newData[i] = data[(i+front)% data.length];
        }
        front = 0;
        tail = size;
        data = newData;

    }

    /**
     * 循环队列出队 队首删除元素
     * @author weidoudou
     * @date 2022/10/26 7:50
     * @param
     * @return E
     **/
    @Override
    public E deQueue() {
        //1 判断循环队列是否为空
        if(isEmpty()){
            throw new IllegalArgumentException("空队列不允许出队");
        }

        //2 出队
        E ret = data[front];
        data[front] = null;
        front = (front+1)% data.length;
        size--;

        //3 动态缩容
        if(size== getCapacity()/4 && getCapacity()/2!=0){
            enSize(getCapacity()/2);
        }

        return ret;
    }

 

3.2    循环队列代码实现 全量:

  • 接口:
package com.company;

/**
 * 队列接口
 * @author weidoudou
 * @date 2022/10/23 11:10
 * @return null
 **/
public interface Queue<E> {

    /**
     * 循环队列入队 队尾插入元素
     * @author weidoudou
     * @date 2022/10/23 11:10
     * @param e 请添加参数描述
     * @return void
     **/
    void enQueue(E e);

    /**
     * 循环队列出队 队首删除元素
     * @author weidoudou
     * @date 2022/10/23 11:11
     * @return E
     **/
    E deQueue();

    /**
     * 队首展示元素
     * @author weidoudou
     * @date 2022/10/23 11:11
     * @return E
     **/
    E getFront();

    /**
     * 获取size
     * @author weidoudou
     * @date 2022/10/23 11:12
     * @return int
     **/
    int getSize();

    /**
     * 是否为空
     * @author weidoudou
     * @date 2022/10/23 11:12
     * @return boolean
     **/
    boolean isEmpty();

}

 

  • 实现类:
package com.company;

public class LoopQueue<E> implements Queue<E>{

    private int front;//队首位置
    private int tail;//队尾位置
    private int size;//大小
    private E[] data;

    /**
     * 无参构造方法
     * @author weidoudou
     * @date 2022/10/23 17:36
     * @return null
     **/
    public LoopQueue(){
        this(10);
    }

    public LoopQueue(int capacity){
        data = (E[]) new Object[capacity+1];
    }

    public int getCapacity(){
        return data.length-1;
    }


    /**
     * 循环队列入队 队尾插入元素
     * @author weidoudou
     * @date 2022/10/23 17:49
     * @param e 请添加参数描述
     * @return void
     **/
    @Override
    public void enQueue(E e) {
        //1 判断队列是否是满的,满的话进行扩容
        if((tail+1)% data.length==front){
            //扩容操作
            enSize(getCapacity()*2);
        }

        //2 队尾插入元素
        data[tail] = e;
        tail = (tail+1)% data.length;
        size++;
    }

    /**
     * 扩容操作
     * @author weidoudou
     * @date 2022/10/23 17:55
     * @param newCapacity 请添加参数描述
     * @return void
     **/
    private void enSize(int newCapacity){
        E[] newData = (E[]) new Object[newCapacity+1];
        for(int i = 0;i<size;i++){
            newData[i] = data[(i+front)% data.length];
        }
        front = 0;
        tail = size;
        data = newData;

    }

    /**
     * 循环队列出队 队首删除元素
     * @author weidoudou
     * @date 2022/10/26 7:50
     * @param
     * @return E
     **/
    @Override
    public E deQueue() {
        //1 判断循环队列是否为空
        if(isEmpty()){
            throw new IllegalArgumentException("空队列不允许出队");
        }

        //2 出队
        E ret = data[front];
        data[front] = null;
        front = (front+1)% data.length;
        size--;

        //3 动态缩容
        if(size== getCapacity()/4 && getCapacity()/2!=0){
            enSize(getCapacity()/2);
        }

        return ret;
    }

    /**
     * 查看队首元素
     * @author weidoudou
     * @date 2022/10/26 8:05
     * @param
     * @return E
     **/
    @Override
    public E getFront() {
        if(isEmpty()){
            throw new IllegalArgumentException("空队列不允许查看队首元素");
        }

        E ert = data[front];
        return ert;
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return front==size;
    }

    @Override
    public String toString() {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(String.format("LoopQueue:size=%d,capacity=%d\n",size,getCapacity()));

        stringBuffer.append("front"); //队列顶在此
        stringBuffer.append("[");
        for(int i=front;i!=tail;i=(i+1)% data.length){
            stringBuffer.append(data[i]);
            if((i+1)% data.length!=tail){
                stringBuffer.append(",");
            }
        }
        stringBuffer.append("]");
        return stringBuffer.toString();
    }
}

 

  • 测试类:
    public static void main(String[] args) {
        Queue<Integer> queue = new LoopQueue<>();
        for(int i = 0;i<10 ;i++){
            queue.enQueue(i);
            System.out.println(queue);

            if(i%3==0){
                queue.deQueue();
                System.out.println(queue);
            }

        }
    }

 

  • 测试结果:
LoopQueue:size=1,capacity=10
front[0]
LoopQueue:size=0,capacity=10
front[]
LoopQueue:size=1,capacity=10
front[1]
LoopQueue:size=2,capacity=10
front[1,2]
LoopQueue:size=3,capacity=10
front[1,2,3]
LoopQueue:size=2,capacity=5
front[2,3]
LoopQueue:size=3,capacity=5
front[2,3,4]
LoopQueue:size=4,capacity=5
front[2,3,4,5]
LoopQueue:size=5,capacity=5
front[2,3,4,5,6]
LoopQueue:size=4,capacity=5
front[3,4,5,6]
LoopQueue:size=5,capacity=5
front[3,4,5,6,7]
LoopQueue:size=6,capacity=10
front[3,4,5,6,7,8]
LoopQueue:size=7,capacity=10
front[3,4,5,6,7,8,9]
LoopQueue:size=6,capacity=10
front[4,5,6,7,8,9]

Process finished with exit code 0

 

标签:10,capacity,队列,LoopQueue,玩转,front,return,数据结构,size
From: https://www.cnblogs.com/1446358788-qq/p/16830741.html

相关文章

  • 下篇:一文玩转Go接口
    空接口既然可以存储任意类型的值,那么从空接口获取到的值是否可以直接使用?看下面栗子package mainimport ( "fmt")var a interface{}var b interface{}f......
  • 【leetcode_C++_栈与队列_day9】232.用栈实现队列&&225. 用队列实现栈
    知识补充:栈与队列理论基础(C++)C++中stack是容器么?​ stack:堆栈栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种......
  • 栈和队列不分家
    写在前面对于我个人来说,我会把数据机构初阶分为三个台阶,今天谈的和之前谈的是一个阶段,后面的二叉树一个,排序一个.栈和队列也同样是我们后面模拟实现二叉树递归和广度遍......
  • 优先队列--著名的TopK问题(最小堆的使用)
    692. TopKFrequentWordsMedium77671FavoriteShareGivenanon-emptylistofwords,returnthe k mostfrequentelements.Youranswershouldbesortedbyfrequen......
  • 图坐标数据结构(结构体)的设计以及栈的应用
    题目描述P为给定的二维平面整数点集。定义P中某点x,如果x满足P中任意点都不在x的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有......
  • 队列结构(Queue)
    队列结构(Queue)队列也是一种受限的线性表,他的特点是先进先出受限之处在于他只允许在表的前端(front)进行删除操作而在表的后端(rear)进行插入操作队列的常见操作:enqu......
  • 数据结构【c语言版】八大算法(上)图文详解带你快速掌握——希尔排序,堆排序,插入排序,选择
    数据结构之八大算法详解(1)——希尔排序,堆排序,插入排序,选择排序,冒泡排序!插入排序基本思想把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所......
  • 数据结构复习——wsdchong
    数据结构复习考试方式:闭卷,180分钟、满分150题型:单选题(20*2)、综合应用题(70分,7题)试卷结构:共四门课,数据结构、计算机组成原理、操作系统、计算机网络。其中数据结构占47分,单选(1......
  • Java知识32 数据结构 枚举 向量【多测师】
    一、Java数据结构包含以下几种接口和类:枚举(Enumeration)位集合()向量()栈()字典()哈希表()属性()二、java枚举接口实例演示Enumeration的用法:publicclassEnumerationTest......
  • 从源码中解析fabric区块数据结构(一)
    从源码中解析fabric区块数据结构(一)前言最近打算基于fabric-sdk-go实现hyperledgerfabric浏览器,其中最重要的一步就是解析fabric的上链区块。虽说fabric是Golang实现的,但......