*Java雙端隊列的知識
Deque
接口是 double ended queue 的縮寫,即雙端隊列,支持在隊列的兩端插入和刪除元素,繼承 Queue
接口。public interface Deque extends Queue
Deque
的 12 種方法總結如下:
- 插入:
- 如果操作失敗則拋出異常
void addFirst(Object e)
void addLast(Object e)
- 如果操作失敗則返回一個特殊值(
null
或false
)boolean offerFirst(Object e)
boolean offerLast(Object e);
- 如果操作失敗則拋出異常
- 刪除:
- 如果操作失敗則拋出異常
Object removeFirst()
Object removeLast()
- 如果操作失敗則返回一個特殊值(
null
或false
)Object pollFirst()
Object pollLast()
- 如果操作失敗則拋出異常
- 獲取:
- 如果操作失敗則拋出異常
Object getFirst()
Object getLast()
- 如果操作失敗則返回一個特殊值(
null
或false
)Object peekFirst()
Object peekLast()
- 如果操作失敗則拋出異常
Deque
與 List
不同,該接口不支持下標訪問元素。Deque
的實現並不嚴格要求禁止插入元素 null
,但強烈鼓勵不插入 null
。任何 Deque
的實現都強烈鼓勵不要插入 null
,因為 null
是多種方法作為一種特殊返回值來表示 Deque
為空。
ArrayDeque
和 LinkedList
類是 Deque
接口的兩個實現類:
ArrayDeque
類由數組支持。適合當作堆棧使用。LinkedList
類由鏈表支持。適合當作FIFO隊列使用。
*代碼
import java.util.Deque; import java.util.LinkedList;
public class DequeTest {
public static void main(String[] args) { Deque<String> deque = new LinkedList<String>(); deque.add("d"); deque.add("e"); deque.add("f"); //從隊首取出元素,不會刪除
System.out.println("隊首取出元素:"+deque.peek()); System.out.println("隊列為:"+deque); //從隊首加入元素(隊列有容量限制時用,無則用addFirst)
deque.offerFirst("c"); System.out.println("隊首加入元素后為:"+deque); //從隊尾加入元素(隊列有容量限制時用,無則用addLast)
deque.offerLast("g"); System.out.println("隊尾加入元素后為:"+deque); //隊尾加入元素
deque.offer("h"); System.out.println("隊尾加入元素后為:"+deque); //獲取並移除隊列第一個元素,pollFirst()也是,區別在於隊列為空時,removeFirst會拋出NoSuchElementException異常,后者返回null
deque.removeFirst(); System.out.println("獲取並移除隊列第一個元素后為:"+deque); //獲取並移除隊列第一個元素,此方法與pollLast 唯一區別在於隊列為空時,removeLast會拋出NoSuchElementException異常,后者返回null
deque.removeLast(); System.out.println("獲取並移除隊列最后一個元素后為:"+deque); //獲取隊列第一個元素.此方法與 peekFirst 唯一的不同在於:如果此雙端隊列為空,它將拋出NoSuchElementException,后者返回null
System.out.println("獲取隊列第一個元素為:"+deque.getFirst()); System.out.println("獲取隊列第一個元素后為:"+deque); //獲取隊列最后一個元素.此方法與 peekLast 唯一的不同在於:如果此雙端隊列為空,它將拋出NoSuchElementException,后者返回null
System.out.println("獲取隊列最后一個元素為:"+deque.getLast()); System.out.println("獲取隊列第一個元素后為:"+deque); //循環獲取元素並在隊列移除元素
while(deque.size()>0){ System.out.println("獲取元素為:"+ deque.pop()+" 並刪除"); } System.out.println("隊列為:"+deque); } }