雙端列表 —— Deque 接口概述,使用ArrayDeque實現隊列和雙端隊列數據結構

Deque接口簡介

Deque譯為雙端隊列,在雙向都能作為隊列來使用,同時可用作棧。Deque接口的方法是對稱成比例的。
Deque接口繼承Queue接口,因此具有Queue,Collection,Iterable的方法屬性。

雙端隊列的工作原理

在常規隊列中,元素是從后面添加的,而從前面刪除的。但是,在雙端隊列中,我們可以從前后插入和刪除元素

雙端隊列數據結構的工作

實現Deque的類

為了使用Deque接口的功能,我們需要使用實現接口的類:

  • ArrayDeque

  • LinkedList

ArrayDeque和Linkedlist實現Deque

如何使用Deque?

在Java中,我們必須導入要使用Deque的包 java.util.Deque 。

Deque<String> animal1 = new ArrayDeque<>();Deque<String> animal2 = new LinkedList<>();

在這里,我們分別創建了類ArrayDeque和LinkedList的對象animal1和animal2。 這些對象可以使用Deque接口的功能。

Deque的方法

Deque接口定義了以下方法:

方法描述
void addFirst(E e)將元素插入此deque的開頭
void addLast(E e)將元素插入此deque的末尾
boolean offerFirst(E e)在此deque的開頭插入指定元素。
boolean offerLast(E e)在此deque的末尾插入指定元素。
E removeFirst()檢索并刪除此deque的第一個元素
E removeLast()檢索并刪除此deque的最后一個元素
E pollFirst()檢索并刪除此deque的第一個元素;如果deque為空,則返回null
E pollLast()檢索并刪除此deque的最后一個元素;如果deque為空,則返回null
E getFirst()檢索但不刪除此deque的第一個元素。
E getLast()檢索但不刪除此deque的最后一個元素。
E peekFirst()檢索但不刪除此deque的第一個元素;如果deque為空,則返回null
E peekLast()檢索但不刪除此deque的最后一個元素;如果deque為空,則返回null
boolean removeFirstOccurrence(Object o)從deque中刪除第一次出現的指定元素(從頭部到尾部遍歷deque時)。
boolean removeLastOccurrence(Object o)從deque中刪除最后一次出現的指定元素(從頭部到尾部遍歷deque時)。
boolean add(E e)將指定元素添加到此deque的末尾。
boolean offer(E e)將指定元素添加到此deque的末尾。
E remove()檢索并刪除此deque的頭部。
E poll()檢索并刪除此deque的頭部;如果deque為空,則返回null。
E element()檢索但不刪除此deque的頭部。
E peek()檢索但不刪除此deque的頭部;如果deque為空,則返回null。
void push(E e)將元素推入此deque的堆棧層次結構中,也就是在deque的頭部插入一個元素。
E pop()從此deque表示的堆棧處彈出一個元素,也就是把deque的頭部元素移除掉。
boolean contains(Object o)如果此deque包含指定元素,則返回true。
int size()返回deque中的元素數。
Iterator<E> iterator()返回一個按元素插入順序遍歷此deque中元素的迭代器。
Iterator<E> descendingIterator()返回一個按元素逆序遍歷此deque中元素的迭代器。

雙端隊列作為堆棧數據結構

Java Collections框架的Stack類提供了堆棧的實現。

但是,建議Deque用作堆棧而不是Stack類。這是因為Stack的方法是同步的。

以下是Deque接口提供的用于實現堆棧的方法:

  • push() - 在雙端隊列的開頭添加元素

  • pop() - 從雙端隊列的開頭刪除元素

  • peek() - 從雙端隊列的開頭返回一個元素

Deque是可以用作棧或隊列的,具體是哪個取決于使用哪些方法。下面是一些示例代碼,演示了如何使用Deque接口。

1. 使用Deque作為隊列

import java.util.Deque;
import java.util.LinkedList;public class Deque{public static void main(String[] args) {Deque<String> queue = new LinkedList<>();// 添加元素到隊列queue.add("Java");queue.add("C++");queue.add("Python");// 獲取隊列的第一個元素,不刪除System.out.println("First element of queue: " + queue.peek());// 獲取并刪除隊首元素String firstElement = queue.poll();System.out.println("Removed first element of queue: " + firstElement);// 隊列中添加一個新元素queue.offer("JavaScript");// 遍歷隊列中的元素System.out.println("All elements of queue:");for (String element : queue) {System.out.println(element);}}
}

此代碼將Deque用作隊列,使用add方法添加元素,并使用peek獲取第一個元素。然后,使用poll方法刪除并獲取隊列中的第一個元素,并使用offer方法將新元素添加到隊列末尾。最后,使用for-each循環遍歷隊列中的所有元素。

2. 使用Deque作為棧

import java.util.Deque;
import java.util.LinkedList;public class Deque{public static void main(String[] args) {Deque<String> stack = new LinkedList<>();// 將元素推入棧中stack.push("Java");stack.push("C++");stack.push("Python");// 獲取棧頂元素,不刪除System.out.println("Top element of stack: " + stack.peek());// 獲取并刪除棧頂元素String topElement = stack.pop();System.out.println("Removed top element of stack: " + topElement);// 將新元素推入棧中stack.push("JavaScript");// 遍歷棧中的所有元素System.out.println("All elements of stack:");for (String element : stack) {System.out.println(element);}}
}

此代碼演示了如何將Deque用作棧。它使用push方法將元素推入棧中,并使用peek獲取棧頂元素。然后,使用pop方法獲取并刪除棧頂元素,并使用push方法將新元素推入棧頂。最后,使用for-each循環遍歷棧中的所有元素。

創建ArrayDeque

為了創建ArrayDeque雙端隊列,我們必須導入java.util.ArrayDeque包。

這是我們可以用Java創建ArrayDeque雙端隊列的方法:

ArrayDeque<Type> animal = new ArrayDeque<>();

在此,Type表示ArrayDeque雙端隊列的類型。例如,

//創建字符串類型ArrayDeque
ArrayDeque<String> animals = new ArrayDeque<>();//創建整數類型ArrayDeque
ArrayDeque<Integer> age = new ArrayDeque<>();

ArrayDeque方法

ArrayDeque類提供了所有的存在于方法Queue和Deque接口。

將元素插入雙端隊列

1.使用add(),addFirst()和addLast()添加元素

  • add() - 將指定的元素插入ArrayDeque雙端隊列的末尾

  • addFirst() -在ArrayDeque雙端隊列的開頭,插入指定的元素

  • addLast() - 在ArrayDeque雙端隊列的末尾插入指定的內容(等效于add())

注意:如果ArrayDeque雙端隊列已滿,則所有這些方法add(),addFirst()和addLast()都會引發IllegalStateException。

例如:

import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();//使用add ()animals.add("Dog");//使用addFirst ()animals.addFirst("Cat");//使用addLast()animals.addLast("Horse");System.out.println("ArrayDeque: " + animals);}
}

輸出結果

ArrayDeque: [Cat, Dog, Horse]

2.使用 offer(),offerFirst()和offerLast()插入元素

  • offer() - 將指定的元素插入ArrayDeque雙端隊列的末尾

  • offerFirst() - 在ArrayDeque雙端隊列的開始處插入指定的元素

  • offerLast() - 將指定的元素插入ArrayDeque雙端隊列的末尾

注意: offer(),offerFirst()并offerLast()返回true是否成功插入元素;否則,返回。如果ArrayDeque雙端隊列已滿,則這些方法返回false。

例如:

import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();//使用offer()animals.offer("Dog");//使用offerFirst()animals.offerFirst("Cat");//使用offerLast()animals.offerLast("Horse");System.out.println("ArrayDeque: " + animals);}
}

輸出結果

ArrayDeque: [Cat, Dog, Horse]

訪問ArrayDeque元素

1.使用getFirst()和getLast()訪問元素

  • getFirst() - 返回ArrayDeque雙端隊列的第一個元素

  • getLast() - 返回ArrayDeque雙端隊列的最后一個元素

注:如果ArrayDeque雙端隊列為空,getFirst()和getLast()拋出NoSuchElementException。

例如:

import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();animals.add("Dog");animals.add("Cat");animals.add("Horse");System.out.println("ArrayDeque: " + animals);// 獲取第一個元素String firstElement = animals.getFirst();System.out.println("第一個元素: " + firstElement);//獲取最后一個元素String lastElement = animals.getLast();System.out.println("最后一個元素: " + lastElement);}
}

輸出結果

ArrayDeque: [Dog, Cat, Horse]
第一個元素: Dog
最后一個元素: Horse

2.使用peek(),peekFirst()和peekLast()方法訪問元素

  • peek() - 返回ArrayDeque雙端隊列的第一個元素

  • peekFirst() - 返回ArrayDeque雙端隊列的第一個元素(等效于peek())

  • peekLast() - 返回ArrayDeque雙端隊列的最后一個元素

例如:

import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();animals.add("Dog");animals.add("Cat");animals.add("Horse");System.out.println("ArrayDeque: " + animals);//使用peek()String element = animals.peek();System.out.println("頭元素: " + element);//使用peekFirst()String firstElement = animals.peekFirst();System.out.println("第一個元素: " + firstElement);//使用peekLastString lastElement = animals.peekLast();System.out.println("最后一個元素: " + lastElement);}
}

輸出結果

ArrayDeque: [Dog, Cat, Horse]
Head Element: Dog
第一個元素: Dog
最后一個元素: Horse

注意:如果ArrayDeque雙端隊列為空,peek(),peekFirst()和getLast()拋出NoSuchElementException。

刪除 ArrayDeque 元素

1.使用remove(),removeFirst(),removeLast()方法刪除元素

  • remove() - 返回并從ArrayDeque雙端隊列的第一個元素中刪除一個元素

  • remove(element) - 返回并從ArrayDeque雙端隊列的頭部刪除指定的元素

  • removeFirst() - 返回并從ArrayDeque雙端隊列中刪除第一個元素(等效于remove())

  • removeLast() - 返回并從ArrayDeque雙端隊列中刪除最后一個元素

注意:如果數組雙端隊列為空,則remove(),removeFirst()和removeLast()方法將引發異常。 另外,如果找不到元素,則remove(element)會引發異常。

例如:

import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();animals.add("Dog");animals.add("Cat");animals.add("Cow");animals.add("Horse");System.out.println("ArrayDeque: " + animals);//使用remove()String element = animals.remove();System.out.println("刪除Element: " + element);System.out.println("新的ArrayDeque: " + animals);//使用removeFirst()String firstElement = animals.removeFirst();System.out.println("刪除第一個元素: " + firstElement);//使用removeLast()String lastElement = animals.removeLast();System.out.println("刪除最后一個元素: " + lastElement);}
}

輸出結果

ArrayDeque: [Dog, Cat, Cow, Horse]
刪除Element: Dog
新的ArrayDeque: [Cat, Cow, Horse]
刪除第一個元素: Cat
刪除最后一個元素: Horse

2.使用poll(),pollFirst()和pollLast()方法刪除元素

  • poll() - 返回并刪除ArrayDeque雙端隊列的第一個元素

  • pollFirst() - 返回并刪除ArrayDeque雙端隊列的第一個元素(等效于poll())

  • pollLast() - 返回并刪除ArrayDeque雙端隊列的最后一個元素

注意:如果ArrayDeque雙端隊列為空,則如果找不到該元素,則poll(),pollFirst()和pollLast()返回null。

例如:

import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();animals.add("Dog");animals.add("Cat");animals.add("Cow");animals.add("Horse");System.out.println("ArrayDeque: " + animals);//使用poll()String element = animals.poll();System.out.println("刪除Element: " + element);System.out.println("新的ArrayDeque: " + animals);//使用pollFirst()String firstElement = animals.pollFirst();System.out.println("刪除第一個元素: " + firstElement);//使用pollLast()String lastElement = animals.pollLast();System.out.println("刪除最后一個元素: " + lastElement);}
}

輸出結果

ArrayDeque: [Dog, Cat, Cow, Horse]
刪除Element: Dog
新的ArrayDeque: [Cat, Cow, Horse]
刪除第一個元素: Cat
刪除最后一個元素: Horse

3.刪除元素:使用clear()方法

要從ArrayDeque雙端隊列中刪除所有元素,我們使用clear()方法。例如:

import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();animals.add("Dog");animals.add("Cat");animals.add("Horse");System.out.println("ArrayDeque: " + animals);//使用clear()animals.clear();System.out.println("新的ArrayDeque: " + animals);}
}

輸出結果

ArrayDeque: [Dog, Cat, Horse]
新的ArrayDeque: []

迭代遍歷ArrayDeque

  • iterator() - 返回可用于遍歷ArrayDeque雙端隊列的迭代器

  • descendingIterator() -返回一個迭代器,該迭代器可用于以相反順序遍歷ArrayDeque雙端隊列

為了使用這些方法,我們必須導入java.util.Iterator包。例如:

import java.util.ArrayDeque;
import java.util.Iterator;class Main {public static void main(String[] args) {ArrayDeque<String> animals= new ArrayDeque<>();animals.add("Dog");animals.add("Cat");animals.add("Horse");System.out.print("ArrayDeque: ");//使用iterator()Iterator<String> iterate = animals.iterator();while(iterate.hasNext()) {System.out.print(iterate.next());System.out.print(", ");}System.out.print("\n反向ArrayDeque: ");//使用descendingIterator()Iterator<String> desIterate = animals.descendingIterator();while(desIterate.hasNext()) {System.out.print(desIterate.next());System.out.print(", ");}}
}

輸出結果

ArrayDeque: [Dog, Cat, Horse]
反向ArrayDeque: [Horse, Cat, Dog]

其他方法

方法內容描述
element()從ArrayDeque雙端隊列的頭部返回一個元素。
contains(element)在ArrayDeque雙端隊列中搜索指定的元素。
如果找到該元素,則返回true,否則返回false。
size()返回ArrayDeque雙端隊列的長度。
toArray()將ArrayDeque雙端隊列轉換為數組并返回。
clone()創建ArrayDeque雙端隊列的副本并返回它。

ArrayDeque作為堆棧

要在Java中實現LIFO(后進先出)堆棧,建議在Stack類上使用雙端隊列。該ArrayDeque類比Stack類快。

ArrayDeque 提供了以下可用于實現堆棧的方法。

  • push() - 在堆棧頂部添加一個元素

  • peek() - 從堆棧頂部返回一個元素

  • pop() - 返回并從堆棧頂部刪除元素

例如:

import java.util.ArrayDeque;class Main {public static void main(String[] args) {ArrayDeque<String> stack = new ArrayDeque<>();//將元素添加到stackstack.push("Dog");stack.push("Cat");stack.push("Horse");System.out.println("Stack: " + stack);//從堆棧頂部訪問元素String element = stack.peek();System.out.println("訪問元素: " + element);//從堆棧頂部刪除元素String remElement = stack.pop();System.out.println("刪除element: " + remElement);}
}

輸出結果

Stack: [Horse, Cat, Dog]
訪問元素: Horse
刪除Element: Horse

ArrayDeque與 LinkedList類

ArrayDeque和Java的LinkedList都實現了Deque接口。但是,它們之間存在一些差異。

  • LinkedList支持空元素,而ArrayDeque不支持。

  • 鏈表中的每個節點都包含到其他節點的鏈接。這就是LinkedList比ArrayDeque需要更多存儲空間的原因。

  • 如果要實現隊列或雙端隊列數據結構,則ArrayDeque可能比LinkedList快。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35741.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35741.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35741.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端架構師的能力要求:打造可靠、靈活和可擴展的Web應用

隨著互聯網技術迅猛發展&#xff0c;現代Web應用程序變得越來越復雜且功能強大。作為一名前端架構師&#xff0c;在這個快節奏且競爭激烈的環境中&#xff0c;你需要具備廣泛而深入地技術知識&#xff0c;并且有能力設計、開發和維護高度可靠、靈活和可擴展性強的Web應用。 深入…

前端發送請求和后端springboot接受參數

0.xhr、 ajax、axios、promise和async/await 和http基本方法 xhr、 ajax、axios、promise和async/await都是異步編程和網絡請求相關的概念和技術&#xff01; xhr&#xff1a;XMLHttpRequest是瀏覽器提供的js對象&#xff08;API&#xff09;&#xff0c;用于請求服務器資源。…

百度百科詞條要如何才能符合要求,上百度百科平臺

百度百科詞條對于內容的審核一直是比較嚴格的&#xff0c;因此必須符合百度百科詞條平臺規則&#xff0c;才能夠上百度百科平臺&#xff0c;下面洛希愛做百科網和大家分享百度百科詞條上平臺的內容和規則要求。 1&#xff0c; 首先&#xff0c;百度百科需要知道的是我們要以公益…

Java基礎集合框架學習(上)

文章目錄 初識基礎框架為什么使用集合框架集合框架的繼承關系ArrayList入門案例單元測試和增刪改查單元測試的注意事項LinkedList入門案例ArrayList底層是數組LinkedList底層是鏈表ArrayList和LinkedList選型ArrayList存放DOG對象 初識基礎框架 Java基礎集合框架是Java編程語言…

jvm里的內存溢出

目錄 堆溢出 虛擬機棧和本地方法棧溢出&#xff08;棧溢出很少出現&#xff09; 方法區和運行時常量池溢出 本機內存直接溢出&#xff08;實際中很少出現、了解即可&#xff09; 堆溢出 堆溢出&#xff1a;最常見的是大list&#xff0c;list里面有很多元素 堆溢出該怎么解決…

ArcGIS入門操作手冊

一.ArcGIS安裝過程 參考本人博客&#xff1a;保姆級Arcgis安裝圖文安裝教程_追憶苔上雪的博客-CSDN博客 二.ArcGIS植被指數計算 (1)使用工具&#xff1a;柵格計算器 打開軟件&#xff0c;右側搜索柵格計算器打開&#xff0c;要是搜索欄不小心叉掉找不到了&#xff0c;可以通…

docker-desktop數據目錄遷移

1.退出docker-desktop后執行 wsl --list -v 如下 NAME STATE VERSION * docker-desktop Stopped 2docker-desktop-data Stopped 22.執行以下命令進行數據導出&#xff1a;&#xff08;需要等待命令執行完成&#xff09…

SpringCache的介紹和入門案例

文章目錄 概述常用注解入門案例 概述 Spring Cache是Spring框架提供的一個緩存抽象層&#xff0c;用于在應用程序中實現緩存的功能。它通過在方法執行前檢查緩存中是否已經存在所需數據&#xff0c;如果存在則直接返回緩存中的數據&#xff0c;如果不存在則執行方法體&#xf…

定義行業新標準?谷歌:折疊屏手機可承受20萬次折疊

根據Patreon賬戶上的消息&#xff0c;Android專家Mishaal Rahman透露&#xff0c;谷歌計劃推出新的硬件質量標準&#xff0c;以滿足可折疊手機市場的需求。Android原始設備制造商&#xff08;OEM&#xff09;將需要完成谷歌提供的問卷調查&#xff0c;并提交樣品設備進行嚴格審…

MySQL慢查詢日志常用參數配置

慢查詢日志 slow log&#xff1a;指query time減去lock time的時間&#xff0c;超過設置的閾值的查詢SQL。 常用配置 #通用配置需配置在mysqld標簽先&#xff0c;版本獨有配置在mysqld-version標簽下 [mysqld] #是否開啟慢日志,Type:Boolean Default Value:OFF slow_log0/1…

基于 JMeter API 開發性能測試平臺

目錄 背景&#xff1a; 常用的 JMeter 類和功能的解釋&#xff1a; JMeter 編寫性能測試腳本的大致流程示意圖&#xff1a; 源碼實現方式&#xff1a; (1) 環境初始化 (2) 環境初始化 (3) 創建測試計劃 (4) 創建 ThreadGroup (5) 創建循環控制器 (6) 創建 Sampler (…

【編碼魔法師系列_六大原則5】迪米特原則(Law of Demeter Principle)

學會設計模式&#xff0c;你就可以像擁有魔法一樣&#xff0c;在開發過程中解決一些復雜的問題。設計模式是由經驗豐富的開發者們&#xff08;GoF&#xff09;凝聚出來的最佳實踐&#xff0c;可以提高代碼的可讀性、可維護性和可重用性&#xff0c;從而讓我們的開發效率更高。通…

每日一題——旋轉數組的最小數字(II)

旋轉數組的最小數字——II 題目鏈接 注&#xff1a;此題是昨天旋轉數組的最小數字——I的拓展延伸&#xff0c;昨天題目數組的條件是不會存在重復元素&#xff0c;而本題數組的元素可以重復&#xff0c;因此建議先做前面一題&#xff0c;進行思考&#xff0c;這樣求解這一題的…

【單片機畢業設計3-基于stm32c8t6的智能家居系統】

【單片機畢業設計3-基于stm32c8t6的智能家居系統】 前言一、功能介紹二、硬件部分三、軟件部分總結 前言 &#x1f525;這里是小殷學長&#xff0c;單片機畢業設計篇3 基于stm32的智能家居控制系統 &#x1f9ff;創作不易&#xff0c;拒絕白嫖&#xff08;有需可點擊最后鏈接&a…

Python自動化測試框架:Pytest和Unittest的區別

pytest和unittest是Python中常用的兩種測試框架&#xff0c;它們都可以用來編寫和執行測試用例&#xff0c;但兩者在很多方面都有所不同。本文將從不同的角度來論述這些區別&#xff0c;以幫助大家更好地理解pytest和unittest。 1. 原理 pytest是基于Python的assert語句和Pytho…

consul安裝啟動流程

普通軟件包安裝 首先cd /opt &#xff0c;將安裝包放到該目錄下 下載consul安裝包 進入consul官網找到自己開發平臺對應的安裝包下載 https://www.consul.io/downloads.html 或使用命令 wget https://releases.hashicorp.com/consul/1.6.2/consul_1.6.2_linux_amd64.zip (如果…

vue3 table動態合并,自定義參數合并單元格

<template><div><el-table :data"tableData" :span-method"objectSpanMethod" border:header-cell-style"{ textAlign: center}"><el-table-column prop"area" label"區域" align"center"&g…

HW樣本《關于“XXXX”微信視頻號發布短視頻的信息說明.exe》的逆向分析

一、概述 樣本運行后會釋放《關于“XXXX”微信視頻號發布短視頻的信息說明.doc》并打開&#xff1b;同時釋放ncloud.exe惡意文件并啟動&#xff1b;調用cmd命令刪除樣本母體&#xff1b;其中ncloud.exe會從互聯網下載類似字母表的數據解密出CS木馬&#xff0c;在內存加載并運行…

《玩轉Python數據分析專欄》大綱

歡迎來到《玩轉Python數據分析分類專欄》&#xff01;在這個專欄中&#xff0c;我們將帶您深入探索數據分析的世界&#xff0c;以Python為工具&#xff0c;解析各個領域的實際應用場景。通過100篇教程&#xff0c;我們將逐步引領您從入門級到高級&#xff0c;從基礎知識到實戰技…

前端安全:探秘安全 HTTP 頭的設置

在當今數字化時代&#xff0c;前端安全至關重要。除了應對常見的攻擊方式外&#xff0c;通過設置安全 HTTP 頭&#xff0c;我們可以加強網站的安全性&#xff0c;減少潛在的威脅。本文將為您詳細解釋什么是安全 HTTP 頭&#xff0c;以及如何通過設置它們來保護您的前端應用。 1…