国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java隊(duì)列

沈建明 / 692人閱讀

摘要:實(shí)現(xiàn)隊(duì)列介紹隊(duì)列為特殊的線性表,隊(duì)列的特點(diǎn)先進(jìn)先出,隊(duì)列插入為入隊(duì),隊(duì)列刪除為出對(duì)。實(shí)現(xiàn)這次使用順序隊(duì)列實(shí)現(xiàn)。

Java 實(shí)現(xiàn)隊(duì)列

介紹

隊(duì)列為特殊的線性表,隊(duì)列的特點(diǎn)先進(jìn)先出(FIFO),隊(duì)列插入為入隊(duì),隊(duì)列刪除為出對(duì)。

Java 實(shí)現(xiàn)

這次使用順序隊(duì)列實(shí)現(xiàn)。(使用數(shù)組),
why?為什么不直接使用順序表作為底層容器,因?yàn)槿腙?duì)操作執(zhí)行順序表尾插入,時(shí)間復(fù)雜度為O(1)

O(1) 普通語句,相互操作,時(shí)間復(fù)雜度為O(1)

出對(duì)操作執(zhí)行表頭刪除操作,時(shí)間復(fù)雜度為O(n),因?yàn)樯婕暗揭粋€(gè)循環(huán)遍歷,移動(dòng),由于時(shí)間復(fù)雜度高,此時(shí)直接想方法將時(shí)間復(fù)雜度降低為O(1) ,即,用雙指針解決。即front和rear兩個(gè)解決

時(shí)間復(fù)雜度 O(n) 涉及一層循環(huán),此時(shí)時(shí)間復(fù)雜度為O(n)

又因?yàn)橹苯痈南聵?biāo),會(huì)導(dǎo)致空間的浪費(fèi),(出隊(duì)操作)此時(shí),為了減少空間的浪費(fèi),將隊(duì)列設(shè)計(jì)為循環(huán)隊(duì)列,目的,避免假滿現(xiàn)象的出現(xiàn)。

空隊(duì)列的時(shí)候 front = rear = 0
入隊(duì) front = 0 rear = 1
此時(shí)繼續(xù)入隊(duì) front = 0 rear = 2
出隊(duì) front = rear = 2 兩者相等
繼續(xù)入隊(duì),front=2 rear = 3
不斷的循環(huán),總有一個(gè)為空,即rear
到隊(duì)滿 即 front = 2 rear = 1;
隊(duì)滿的判斷 front = (rear + 1)% size
real永遠(yuǎn)為空

代碼 接口
package demo.mingm.struct.queue;

/**
 * 接口 隊(duì)列
* @author ming
* @date 2018/11/17
*/
public interface Queue {
    // 定義數(shù)組長度
    public static final int DEFAULT_SIZE = 10;
    // 返回隊(duì)列長度
    int size();
    // 判斷隊(duì)列是否為空
    boolean isEmpty();
    // 判斷隊(duì)列是否已滿
    boolean isFull();
    // 入隊(duì), 成功true 錯(cuò)誤false
    boolean add(T data);
    // offer 入隊(duì),和add方法不同的是,如果隊(duì)滿,或傳入的為空,將會(huì)拋出錯(cuò)誤,不會(huì)自動(dòng)擴(kuò)充
    boolean offer(T data);
    // 返回隊(duì)頭元素,不執(zhí)行刪除操作,為空 返回null
    T peek();
    // 返回隊(duì)頭元素,如果為空,將會(huì)拋出異常
    T element();
    // 出隊(duì),執(zhí)行刪除操作,若為空,返回null
    T poll();
    // 出隊(duì),執(zhí)行刪除操作,若為空,拋出異常
    T remove();
    // 清空隊(duì)列
    void cleameQueue();
    
}
實(shí)現(xiàn)接口的類
package demo.mingm.struct.queue;
import java.util.Arrays;
import java.util.Vector;
public class SeqQueue implements Queue {
    private T[] elementData;    // 儲(chǔ)存數(shù)據(jù)的數(shù)組
    private int size;    // 儲(chǔ)存大小
    private int front, rear;    // 指針指向數(shù)組的元素,一個(gè)前,一個(gè)后
    private int real;
    
    public SeqQueue() {
        elementData= (T[]) new Object[DEFAULT_SIZE];
        // 指針的初始化
        this.front = 0;
        this.rear = 0;
        this.size = 0;
    }
    
    public SeqQueue(int length) {
        elementData = (T[]) new Object[length];
        this.front = 0;
        this.rear = 0;
        this.size = 0;
    }
    
    public int getSize() {
        return this.size;
    }
    
    public int getFront() {
        return this.front;
    }
    
    public int getRear() {
        return this.rear;
    }
    
    public void setSize(int size) {
        this.size = size;
    }
    
    public void setFront(int front) {
        this.front = front;
    }
    
    public void setRear(int rear) {
        this.rear = rear;
    }
    
    // 獲取隊(duì)列長度
    @Override
    public int size() {
        return this.getSize();
    }

    // 判斷隊(duì)列是否為空
    @Override
    public boolean isEmpty() {
        return this.getRear() == this.getFront();
    }
    
    // 判斷隊(duì)列是否已滿
    @Override
    public boolean isFull() {
        return this.getFront() == (this.getRear() + 1) % this.elementData.length;
    }
    
    // 入隊(duì)操作,如果不滿,自動(dòng)擴(kuò)充數(shù)組
    @Override
    public boolean add(T data) {
        if(this.isFull()) {
            Arrays.copyOf(elementData, elementData.length*2);
        }
        // 是否插入空
        if(data == null)
            return false;
        // 添加data
        elementData[this.getRear()] = data;
        // 移動(dòng)指針
        this.rear++;    // 創(chuàng)造單向隊(duì)列
        this.size++;
        return true;
    }

    @Override
    public boolean offer(T data) {
        if(this.isFull() || data == null) {
            throw new NullPointerException("error 1");
        }
        // 添加data
        this.elementData[this.getRear()] = data;
        // 移動(dòng)指針
        this.real = (this.real + 1)%elementData.length;    // 創(chuàng)造循環(huán)隊(duì)列
        this.size++;
        return true;
    }

    // 返回隊(duì)頭元素,不刪除
    @Override
    public T peek() {
        if(this.isEmpty())
            return null;
        return this.elementData[this.getFront()];
    }

    // 返回隊(duì)頭元素
    @Override
    public T element() {
        if(this.isEmpty())
            throw  new NullPointerException("error 2");
        return this.elementData[this.getFront()];
    }

    // 出隊(duì)
    @Override
    public T poll() {
        if (this.isEmpty())
            return null;
        T tmp = this.peek();
        // 循環(huán)隊(duì)列
        this.front = (this.getFront() + 1 ) % this.elementData.length;
        return tmp;
    }

    // 出隊(duì)
    @Override
    public T remove() {
        if (this.isEmpty())
            throw  new NullPointerException("error 3");
        T tmp = this.peek();
        // 循環(huán)隊(duì)列
        this.front = (this.getFront() + 1 ) % this.elementData.length;
        return tmp;
    }

    // 清空
    @Override
    public void cleameQueue() {
        this.real = 0;
        this.front = 0;
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72278.html

相關(guān)文章

  • Java知識(shí)點(diǎn)總結(jié)(Java容器-Queue)

    摘要:知識(shí)點(diǎn)總結(jié)容器知識(shí)點(diǎn)總結(jié)容器接口與是在同一級(jí)別,都是繼承了接口。另一種隊(duì)列則是雙端隊(duì)列,支持在頭尾兩端插入和移除元素,主要包括。一個(gè)由鏈表結(jié)構(gòu)組成的無界阻塞隊(duì)列。是一個(gè)阻塞的線程安全的隊(duì)列,底層實(shí)現(xiàn)也是使用鏈?zhǔn)浇Y(jié)構(gòu)。 Java知識(shí)點(diǎn)總結(jié)(Java容器-Queue) @(Java知識(shí)點(diǎn)總結(jié))[Java, Java容器] Queue Queue接口與List、Set是在同一級(jí)別,都是繼承了...

    hedzr 評(píng)論0 收藏0
  • [Java并發(fā)-6]“管程”-java管程初探

    摘要:語言在之前,提供的唯一的并發(fā)原語就是管程,而且之后提供的并發(fā)包,也是以管程技術(shù)為基礎(chǔ)的。但是管程更容易使用,所以選擇了管程。線程進(jìn)入條件變量的等待隊(duì)列后,是允許其他線程進(jìn)入管程的。并發(fā)編程里兩大核心問題互斥和同步,都可以由管程來幫你解決。 并發(fā)編程這個(gè)技術(shù)領(lǐng)域已經(jīng)發(fā)展了半個(gè)世紀(jì)了。有沒有一種核心技術(shù)可以很方便地解決我們的并發(fā)問題呢?這個(gè)問題, 我會(huì)選擇 Monitor(管程)技術(shù)。Ja...

    Steve_Wang_ 評(píng)論0 收藏0
  • 什么是阻塞隊(duì)列?如何使用阻塞隊(duì)列來實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模型?

    摘要:什么是阻塞隊(duì)列阻塞隊(duì)列是一個(gè)在隊(duì)列基礎(chǔ)上又支持了兩個(gè)附加操作的隊(duì)列。阻塞隊(duì)列的應(yīng)用場景阻塞隊(duì)列常用于生產(chǎn)者和消費(fèi)者的場景,生產(chǎn)者是向隊(duì)列里添加元素的線程,消費(fèi)者是從隊(duì)列里取元素的線程。由鏈表結(jié)構(gòu)組成的無界阻塞隊(duì)列。 什么是阻塞隊(duì)列? 阻塞隊(duì)列是一個(gè)在隊(duì)列基礎(chǔ)上又支持了兩個(gè)附加操作的隊(duì)列。 2個(gè)附加操作: 支持阻塞的插入方法:隊(duì)列滿時(shí),隊(duì)列會(huì)阻塞插入元素的線程,直到隊(duì)列不滿。 支持阻塞的...

    jemygraw 評(píng)論0 收藏0
  • java 隊(duì)列

    摘要:是基于鏈接節(jié)點(diǎn)的線程安全的隊(duì)列。通過這些高效并且線程安全的隊(duì)列類,為我們快速搭建高質(zhì)量的多線程程序帶來極大的便利。隊(duì)列內(nèi)部僅允許容納一個(gè)元素。該隊(duì)列的頭部是延遲期滿后保存時(shí)間最長的元素。 隊(duì)列簡述 Queue: 基本上,一個(gè)隊(duì)列就是一個(gè)先入先出(FIFO)的數(shù)據(jù)結(jié)構(gòu)Queue接口與List、Set同一級(jí)別,都是繼承了Collection接口。LinkedList實(shí)現(xiàn)了Deque接 口。...

    goji 評(píng)論0 收藏0
  • Java 隊(duì)列

    摘要:隊(duì)列中有元素時(shí),就說明有過期了,線程繼續(xù)執(zhí)行,然后元素出隊(duì),根據(jù)相應(yīng)的移除緩存。所以嚴(yán)格來說,雖然實(shí)現(xiàn)了隊(duì)列接口,但是它的目的卻并不是隊(duì)列,而是將生產(chǎn)者消費(fèi)者線程配對(duì)。轉(zhuǎn)移隊(duì)列鏈?zhǔn)睫D(zhuǎn)移隊(duì)列。 引言 本周在編寫短信驗(yàn)證碼頻率限制切面的時(shí)候,經(jīng)潘老師給的實(shí)現(xiàn)思路,使用隊(duì)列進(jìn)行實(shí)現(xiàn)。 看了看java.util包下的Queue接口,發(fā)現(xiàn)還從來沒用過呢! Collection集合類接口,由它派生...

    Pocher 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

沈建明

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<