亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java數(shù)據(jù)結(jié)構(gòu)之棧與隊列實例詳解

 更新時間:2021年11月30日 10:30:55   作者:/少司命  
這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之棧與隊列的相關(guān)資料,算是作為用java描述數(shù)據(jù)結(jié)構(gòu)的一個開始,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

一,棧

1,概念

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

?

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

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

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

2,棧的操作

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

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

3,棧的實現(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,實現(xiàn)mystack

public class MyStack<T> {
    private T[] elem;//數(shù)組
    private int top;//當前可以存放數(shù)據(jù)元素的下標-》棧頂指針
 
    public MyStack() {
        this.elem = (T[])new Object[10];
    }
 
    /**
     * 入棧操作
     * @param item 入棧的元素
     */
    public void push(T item) {
        //1、判斷當前棧是否是滿的
        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 class MyStack<T> {
    private T[] elem;//數(shù)組
    private int top;//當前可以存放數(shù)據(jù)元素的下標-》棧頂指針
 
    public MyStack() {
        this.elem = (T[])new Object[10];
    }
 
    /**
     * 入棧操作
     * @param item 入棧的元素
     */
    public void push(T item) {
        //1、判斷當前棧是否是滿的
        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;
    }
}

二,隊列

1,概念

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

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

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

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

?2,隊列的實現(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,實現(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());
       
    }

棧、隊列與數(shù)組的區(qū)別?

A: 棧、隊列和優(yōu)先級隊列與數(shù)組主要有如下三個區(qū)別:

A: (一)程序員工具?

數(shù)組和其他的結(jié)構(gòu)(棧、隊列、鏈表、樹等等)都適用于數(shù)據(jù)庫應(yīng)用中作為數(shù)據(jù)記錄。它們常用于記錄那些對應(yīng)于現(xiàn)實世界的對象和活動的數(shù)據(jù),如職員檔案等,這些結(jié)構(gòu)便于數(shù)據(jù)的訪問:它們易于進行插入、刪除和查找特定數(shù)據(jù)項的操作。?

然而,本篇要講解的數(shù)據(jù)結(jié)構(gòu)和算法更多的是作為程序員的工具來運用。它們主要作為構(gòu)思算法的輔助工具,而不是完全的數(shù)據(jù)存儲工具。這些數(shù)據(jù)結(jié)構(gòu)的生命周期比那些數(shù)據(jù)庫類型的結(jié)構(gòu)要短得多。在程序操作執(zhí)行期間它們才被創(chuàng)建,通常用它們?nèi)?zhí)行某項特殊的任務(wù);當完成任務(wù)之后,它們則被銷毀。

A: (二)受限訪問?

在數(shù)組中,若知道數(shù)據(jù)項的下標,便可以立即訪問該數(shù)據(jù)項;而在本篇的數(shù)據(jù)結(jié)構(gòu)中,訪問是受限制的,即在特定時刻只有一個數(shù)據(jù)項可以被讀取或者刪除。?

這些結(jié)構(gòu)接口的設(shè)計增強了這種受限訪問,訪問其他數(shù)據(jù)項理論上是不允許的。

A: (三)更加抽象?

棧、隊列和優(yōu)先隊列是比數(shù)組和其他數(shù)據(jù)存儲結(jié)構(gòu)更為抽象的結(jié)構(gòu)。主要是通過接口對棧、隊列和優(yōu)先隊列進行定義,接口表明了它們可以完成的操作,而主要實現(xiàn)機制對用戶來說是不可見的。?

例如:棧的實現(xiàn)機制可以用數(shù)組實現(xiàn),本篇的示例就是這樣處理的,但它也可以用鏈表來實現(xiàn)。優(yōu)先級隊列的內(nèi)部實現(xiàn)可以用數(shù)組或一種特別的樹-堆來實現(xiàn)。

總結(jié)

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

相關(guān)文章

  • 用Java實現(xiàn)24點游戲

    用Java實現(xiàn)24點游戲

    喜歡玩游戲的有福啦,文中有非常詳細的開發(fā)框架,按著框架來實現(xiàn)就好啦.而且24點游戲是經(jīng)典的紙牌益智游戲.,需要的朋友可以參考下
    2021-05-05
  • Java中對List去重 Stream去重的解決方法

    Java中對List去重 Stream去重的解決方法

    這篇文章主要介紹了Java中對List去重, Stream去重的問題解答,文中給大家介紹了Java中List集合去除重復(fù)數(shù)據(jù)的方法,需要的朋友可以參考下
    2018-04-04
  • Java設(shè)計模式之開閉原則精解

    Java設(shè)計模式之開閉原則精解

    設(shè)計模式(Design?pattern)代表了最佳的實踐,通常被有經(jīng)驗的面向?qū)ο蟮能浖_發(fā)人員所采用。設(shè)計模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。本篇介紹設(shè)計模式七大原則之一的開閉原則
    2022-02-02
  • 如何基于JAVA讀取yml配置文件指定key內(nèi)容

    如何基于JAVA讀取yml配置文件指定key內(nèi)容

    這篇文章主要介紹了如何基于JAVA讀取yml配置文件指定key內(nèi)容,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • RocketMQ事務(wù)消息機制詳解

    RocketMQ事務(wù)消息機制詳解

    這篇文章主要介紹了RocketMQ事務(wù)消息機制詳解,RocketMQ服務(wù)端將消息持久化之后,向發(fā)送方返回Ack確認消息已經(jīng)發(fā)送成功,由于消息為半事務(wù)消息,在未收到生產(chǎn)者對該消息的二次確認前,此消息被標記成"暫不能投遞"狀態(tài),需要的朋友可以參考下
    2024-01-01
  • idea推送項目到gitee中的創(chuàng)建方法

    idea推送項目到gitee中的創(chuàng)建方法

    這篇文章主要介紹了idea推送項目到gitee中的創(chuàng)建方法,本文通過圖文實例相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • struts+spring+hibernate三個框架的整合

    struts+spring+hibernate三個框架的整合

    這篇文章主要介紹了struts+spring+hibernate三個框架的整合,需要的朋友可以參考下
    2017-09-09
  • Java 網(wǎng)絡(luò)爬蟲基礎(chǔ)知識入門解析

    Java 網(wǎng)絡(luò)爬蟲基礎(chǔ)知識入門解析

    這篇文章主要介紹了Java 網(wǎng)絡(luò)爬蟲基礎(chǔ)知識入門解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • java右下角彈窗示例分享

    java右下角彈窗示例分享

    這篇文章主要介紹了java右下角彈窗示例,需要的朋友可以參考下
    2014-04-04
  • 基于Java生成GUID的實現(xiàn)方法

    基于Java生成GUID的實現(xiàn)方法

    本篇文章是對Java生成GUID的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05

最新評論