最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java深入了解數(shù)據(jù)結(jié)構(gòu)之棧與隊列的詳解

 更新時間:2022年01月27日 16:49:16   作者:/少司命  
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊列,在Java的時候,對于棧與隊列的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時候能夠有扎實(shí)的基礎(chǔ)能力。本文小編就來詳細(xì)說說Java中的棧與隊列,需要的朋友可以參考一下

一,棧

1,概念

在我們軟件應(yīng)用 ,棧這種后進(jìn)先出數(shù)據(jù)結(jié)構(gòu)的應(yīng)用是非常普遍的。比如你用瀏 覽器上網(wǎng)時不管什么瀏覽器都有 個"后退"鍵,你點(diǎn)擊后可以接訪問順序的逆序加載瀏覽過的網(wǎng)頁。

很多類似的軟件,比如 Word Photoshop 等文檔或圖像編 軟件中 都有撤銷 )的操作,也是用棧這種方式來實(shí)現(xiàn)的,當(dāng)然不同的軟件具體實(shí)現(xiàn)會有很大差異,不過原理其實(shí)都是一樣的。

棧( stack )是限定僅在表尾進(jìn)行插入和刪除的線性表

棧:一種特殊的線性表,其只允許在固定的一端進(jìn)行插入和刪除元素操作。進(jìn)行數(shù)據(jù)插入和刪除操作的一端稱為棧 頂,另一端稱為棧底。棧中的數(shù)據(jù)元素遵守后進(jìn)先出LIFO(Last In First Out)的原則。

2,棧的操作

壓棧:棧的插入操作叫做進(jìn)棧/壓棧/入棧,入數(shù)據(jù)在棧頂。

出棧:棧的刪除操作叫做出棧。出數(shù)據(jù)在棧頂。

3,棧的實(shí)現(xiàn)

①入棧

 public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        int ret = stack.push(4);
        System.out.println(ret);
    }

②出棧

  public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        int ret1 = stack.pop();
        int ret2 = stack.pop();
        System.out.println(ret1);
        System.out.println(ret2);
    }

③獲取棧頂元素

 public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        int ret1 = stack.pop();
        int ret2 = stack.pop();
        int ret3 = stack.peek();
        System.out.println(ret1);
        System.out.println(ret2);
        System.out.println(ret3);
    }

④判斷棧是否為空

  public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        int ret1 = stack.pop();
        int ret2 = stack.pop();
        int ret3 = stack.peek();
        System.out.println(ret1);
        System.out.println(ret2);
        System.out.println(ret3);
        stack.pop();
        boolean flag = stack.empty();
        System.out.println(flag);
    }

 4,實(shí)現(xiàn)mystack

public class MyStack<T> {
    private T[] elem;//數(shù)組
    private int top;//當(dāng)前可以存放數(shù)據(jù)元素的下標(biāo)-》棧頂指針
 
    public MyStack() {
        this.elem = (T[])new Object[10];
    }
 
    /**
     * 入棧操作
     * @param item 入棧的元素
     */
    public void push(T item) {
        //1、判斷當(dāng)前棧是否是滿的
        if(isFull()){
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        //2、elem[top] = item  top++;
        this.elem[this.top++] = item;
    }
 
    public boolean isFull(){
        return this.elem.length == this.top;
    }
 
    /**
     * 出棧
     * @return 出棧的元素
     */
    public T pop() {
        if(empty()) {
            throw new UnsupportedOperationException("棧為空!");
        }
        T ret = this.elem[this.top-1];
        this.top--;//真正的改變了top的值
        return ret;
    }
 
    /**
     * 得到棧頂元素,但是不刪除
     * @return
     */
    public T peek() {
        if(empty()) {
            throw new UnsupportedOperationException("棧為空!");
        }
        //this.top--;//真正的改變了top的值
        return this.elem[this.top-1];
    }
    public boolean empty(){
        return this.top == 0;
    }
}
public static void main(String[] args) {
        MyStack<Integer> myStack = new MyStack<>();
        myStack.push(1);
        myStack.push(2);
        myStack.push(3);
        System.out.println(myStack.peek());
        System.out.println(myStack.pop());
        System.out.println(myStack.pop());
        System.out.println(myStack.pop());
        System.out.println(myStack.empty());
        System.out.println("============================");
        MyStack<String> myStack2 = new MyStack<>();
        myStack2.push("hello");
        myStack2.push("word");
        myStack2.push("thank");
        System.out.println(myStack2.peek());
        System.out.println(myStack2.pop());
        System.out.println(myStack2.pop());
        System.out.println(myStack2.pop());
        System.out.println(myStack2.empty());
 
    }

二,隊列

1,概念

像移動、聯(lián)通、電信等客服電話,客服人員與客戶相比總是少數(shù),在所有的客服人員都占線的情況下,客戶會被要求等待,直到有某個客服人員空下來,才能讓最先等待的客戶接通電話。這里也是將所有當(dāng)前撥打客服電話的客戶進(jìn)行了排隊處理。

操作系統(tǒng)和客服系統(tǒng)中,都是應(yīng)用了種數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)剛才提到的先進(jìn)先出的排隊功能,這就是隊列。

隊列(queue) 是只允許在一端進(jìn)行插入操作,而在另一端進(jìn)行刪除操作的線性表

隊列:只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊列具有先進(jìn)先出FIFO(First In First Out) 入隊列:進(jìn)行插入操作的一端稱為隊尾(Tail/Rear) 出隊列:進(jìn)行刪除操作的一端稱為隊頭 (Head/Front)

2,隊列的實(shí)現(xiàn)

①入隊

 public static void main(String[] args) {
        Deque<Integer> queue = new LinkedList<>();
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        queue.offer(4);
        
    }

②出隊

  public static void main(String[] args) {
        Deque<Integer> queue = new LinkedList<>();
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        queue.offer(4);
        System.out.println(queue.poll());
        System.out.println(queue.poll());
 
    }

③獲取隊首元素

public static void main(String[] args) {
        Deque<Integer> queue = new LinkedList<>();
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        queue.offer(4);
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println("-----------------");
        System.out.println(queue.peek());
    }

3,實(shí)現(xiàn)myqueue

class Node {
    private int val;
    private Node next;
    public int getVal() {
        return val;
    }
    public void setVal(int val) {
        this.val = val;
    }
    public Node getNext() {
        return next;
    }
    public void setNext(Node next) {
        this.next = next;
    }
    public Node(int val) {
        this.val = val;
    }
}
public class MyQueue {
    private Node first;
    private Node last;
    //入隊
    public void offer(int val) {
        //尾插法  需要判斷是不是第一次插入
        Node node = new Node(val);
        if(this.first == null) {
            this.first = node;
            this.last = node;
        }else {
            this.last.setNext(node);//last.next = node;
            this.last = node;
        }
    }
    //出隊
    public int poll() {
        //1判斷是否為空的
        if(isEmpty()) {
            throw new UnsupportedOperationException("隊列為空!");
        }
        //this.first = this.first.next;
        int ret = this.first.getVal();
        this.first = this.first.getNext();
        return ret;
    }
    //得到隊頭元素但是不刪除
    public int peek() {
        //不要移動first
        if(isEmpty()) {
            throw new UnsupportedOperationException("隊列為空!");
        }
        return this.first.getVal();
    }
    //隊列是否為空
    public boolean isEmpty() {
        return this.first == null;
    }
}
 public static void main(String[] args) {
        MyQueue myQueue = new MyQueue();
        myQueue.offer(1);
        myQueue.offer(2);
        myQueue.offer(3);
        System.out.println(myQueue.peek());
        System.out.println(myQueue.poll());
        System.out.println(myQueue.poll());
        System.out.println(myQueue.poll());
        System.out.println(myQueue.isEmpty());
       
    }

到此這篇關(guān)于Java深入了解數(shù)據(jù)結(jié)構(gòu)之棧與隊列的詳解的文章就介紹到這了,更多相關(guān)Java 棧與隊列 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實(shí)例代碼

    Java實(shí)現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實(shí)例代碼

    本文主要介紹了Java實(shí)現(xiàn)Word/Pdf/TXT轉(zhuǎn)html的實(shí)例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Java冒泡排序簡單實(shí)現(xiàn)

    Java冒泡排序簡單實(shí)現(xiàn)

    這篇文章主要介紹了Java冒泡排序簡單實(shí)現(xiàn),具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Spring Bean Scope 有狀態(tài)的Bean與無狀態(tài)的Bean

    Spring Bean Scope 有狀態(tài)的Bean與無狀態(tài)的Bean

    這篇文章主要介紹了Spring Bean Scope 有狀態(tài)的Bean與無狀態(tài)的Bean,每個用戶有自己特有的一個實(shí)例,在用戶的生存期內(nèi),bean保持了用戶的信息,下面來了解有狀態(tài)和無狀態(tài)的區(qū)別吧
    2022-01-01
  • Java編程實(shí)現(xiàn)五子棋人人對戰(zhàn)代碼示例

    Java編程實(shí)現(xiàn)五子棋人人對戰(zhàn)代碼示例

    這篇文章主要介紹了Java編程實(shí)現(xiàn)五子棋人人對戰(zhàn)代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-11-11
  • Java顯式鎖詳情

    Java顯式鎖詳情

    這篇文章主要詳細(xì)的介紹了shenJava顯式鎖常用的api及標(biāo)準(zhǔn)用法,感興趣的朋友,需要的朋友可以參考下面文章里的內(nèi)容
    2021-09-09
  • SSH框架的常見問題和解決方法

    SSH框架的常見問題和解決方法

    SSH框架的常見問題和解決方法,需要的朋友可以參考一下
    2013-02-02
  • Java多線程Condition接口原理介紹

    Java多線程Condition接口原理介紹

    這篇文章主要介紹了Java多線程Condition接口原理介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Spark Streaming算子開發(fā)實(shí)例

    Spark Streaming算子開發(fā)實(shí)例

    這篇文章主要介紹了Spark Streaming算子開發(fā)實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • java讀取json文件的2種方式例子

    java讀取json文件的2種方式例子

    這篇文章主要給大家介紹了關(guān)于java讀取json文件的2種方式,在開發(fā)過程中有時會遇到需要讀取.json文件的需求,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Java中List介紹及常見方法和五種遍歷方式詳解

    Java中List介紹及常見方法和五種遍歷方式詳解

    這篇文章主要給大家介紹了關(guān)于Java中List介紹及常見方法和五種遍歷方式的相關(guān)資料,Java的List接口是集合框架的一部分,定義了一個有序的集合,允許存儲重復(fù)的元素,并且可以通過索引訪問這些元素,需要的朋友可以參考下
    2024-12-12

最新評論

云阳县| 宿松县| 洪江市| 蓬莱市| 泰州市| 隆化县| 增城市| 宁安市| 象山县| 南投县| 武安市| 固阳县| 怀来县| 武夷山市| 阿合奇县| 调兵山市| 瑞昌市| 大冶市| 临沧市| 唐山市| 台南市| 永登县| 子洲县| 天全县| 新民市| 宜州市| 上林县| 梅河口市| 田阳县| 新昌县| 富源县| 金堂县| 宁波市| 凤山县| 务川| 赣榆县| 安塞县| 宁夏| 玛沁县| 克拉玛依市| 阿勒泰市|