刷leetcode時(shí),重新認(rèn)識LinkedList實(shí)現(xiàn)棧、隊(duì)列或者雙端隊(duì)列
如果想進(jìn)大廠免不了要leetcode,而leetcode時(shí)免不了很多題跟棧,隊(duì)列有關(guān),重新認(rèn)識一下LinkedList也許能在不時(shí)之需時(shí),助你進(jìn)入大廠。LinkedList實(shí)現(xiàn)了Deque和Queue接口,可以按照隊(duì)列、棧和雙端隊(duì)列的方式進(jìn)行操作。
0x01:Queue接口
Queue里面的方法,Queue擴(kuò)展了Collection,它的主要操作有三個(gè)功能操作。每個(gè)操作有2個(gè)方法,針對隊(duì)列長度是否受限制,對應(yīng)是否拋異常。有些隊(duì)列的是有長度限制的,本例的LinkedList實(shí)現(xiàn)queue沒長度限制。
在尾部添加元素 (add, offer):add()會在長度不夠時(shí)拋出IllegalStateException異常;offer()則不會,只返回false;
查看頭部元素 (element, peek):返回頭部元素,但不改變隊(duì)列。element()會在沒元素時(shí)拋出NoSuchElementException異常,而peek()返回null;
刪除頭部元素 (remove, poll):返回頭部元素,并且從隊(duì)列中刪除。remove()會在沒元素時(shí)拋出NoSuchElementException異常;? 而poll()返回null;?
LinkedList模擬隊(duì)列
import?java.util.LinkedList;
import?java.util.Queue;
/**
*?用LinkedList模擬隊(duì)列,因?yàn)殒湵砩瞄L插入和刪除
*/
public?class?QueueDemo{
????public?static?void?main(String?[]?args)?{?
????????//做劍指offer遇見過這個(gè)數(shù)結(jié)
????????Queue?queue?=?new?LinkedList();
????????//追加元素
????????queue.add("zero");
????????queue.offer("one");
????????queue.offer("two");
????????queue.offer("three");
????????queue.offer("four");
????????System.out.println(queue);//[zero,?one,?two,?three,?four]
????????//從隊(duì)首取出元素并刪除
????????System.out.println(queue.poll());?//?zero
????????System.out.println(queue.remove());?//?one
????????System.out.println(queue);?//[two,?three,?four]
????????//從隊(duì)首取出元素但是不刪除
????????String?peek?=?queue.peek();
????????System.out.println(peek);?//?two
????????//遍歷隊(duì)列,這里要注意,每次取完元素后都會刪除,整個(gè)
????????//隊(duì)列會變短,所以只需要判斷隊(duì)列的大小即可
????????while(queue.size()?>?0)?{
????????????System.out.println(queue.poll());
????????}//two?three?four
????}
}
0x02:Deque接口
Java中有一個(gè)類Stack,用于表示棧,但該類已經(jīng)過時(shí)了。Java中沒有單獨(dú)的棧接口,棧相關(guān)方法包括在了表示雙端隊(duì)列的接口Deque中,主要有三個(gè)方法。
push()表示入棧,在頭部添加元素,棧的空間可能是有限的,如果棧滿了,push會拋出異常IllegalStateException;
pop()表示出棧,返回頭部元素,并且從棧中刪除,如果棧為空,會拋出NoSuchElementException異常;
peek()查看棧頭部元素,不修改棧,如果棧為空,返回null;
棧和隊(duì)列只是雙端隊(duì)列的特殊情況,它們的方法都可以使用雙端隊(duì)列的方法替代,使用不同的名稱和方法,概念上更為清晰。具體參考Deque接口里面的方法。
LinkedList模擬棧
import?java.util.Deque;
import?java.util.LinkedList;
public?class?StackDemo{
????public?static?void?main(String[]?args)?{
????????/*模擬棧,這是從頭開始進(jìn)來的*/
????????Deque?deque?=?new?LinkedList();
????????/*Pushes?an?element?onto?the?stack?at?the?head?of?this?dequeue?*/
????????deque.push("a");
????????deque.push("b");
????????deque.push("c");
????????System.out.println(deque);?//[c,?b,?a]
????????//獲取棧首元素后,元素不會出棧
????????System.out.println(deque.peek());//c
????????while(deque.size()?>?0)?{
????????????//獲取棧首元素后,元素將會出棧
????????????System.out.println(deque.pop());//c?b?a
????????}
????????System.out.println(deque);//[]
????????/*模擬棧*/
????????deque.offerLast("a");
????????deque.offerLast("b");
????????deque.offerLast("c");//?[a,?b,?c]
????????while(!deque.isEmpty()){
????????????System.out.println(deque.pollLast());
????????}
????}???//?先輸出c再b最后a
} 
喜歡,在看
