天天看點

資料結構:棧、隊列、雙端隊列、優先隊列

一、棧Stack

特性:先進後出、後進先出

時間複雜度:添加和删除元素O(1),查詢某個元素O(n)

資料結構:棧、隊列、雙端隊列、優先隊列

具體實作和常用方法請看棧Java官方文檔

源碼文檔

示例代碼:

Stack<Integer> stack = new Stack<>();//建立Stack執行個體
stack.push(1);//在棧頂插入元素
stack.push(2);
stack.push(3);
stack.push(4);
System.out.println(stack);//輸出棧
System.out.println(stack.search(4));//元素4在棧中位置,下标從1開始
stack.pop();//移除棧頂元素
stack.pop();
Integer topElement = stack.peek();//檢視棧頂元素
System.out.println(topElement);
System.out.println("3的位置"+stack.search(3));
           

運作結果:

[1, 2, 3, 4]
1
2
3的位置-1
           

二、隊列Queue

特性:先進先出、後進後出

時間複雜度:添加和删除元素O(1),查詢某個元素O(n)

資料結構:棧、隊列、雙端隊列、優先隊列

具體實作和常用方法請看隊列Java官方文檔

源碼文檔

示例代碼:

//建立隊列的實作類LinkedList執行個體
		Queue<String> queue = new LinkedList<String>();
		queue.offer("one");//向隊尾中插入元素
		queue.offer("two");
		queue.offer("three");
		queue.offer("four");
		System.out.println(queue);//列印隊列
		
		String polledElement = queue.poll();//取出隊頭元素
		System.out.println(polledElement);
		System.out.println(queue);
		
		String peekedElement = queue.peek();//查詢隊頭元素
		System.out.println(peekedElement);
		System.out.println(queue);
		//周遊隊列
		while (queue.size()>0) {
			System.out.println(queue.poll());
		}
           

運作結果:

[one, two, three, four]
one
[two, three, four]
two
[two, three, four]
two
three
four
           

三、雙端隊列Deque

雙端隊列為棧和隊列的結合體。它可以往隊列前端添加或移除元素,也可以往隊列後端添加或移除元素

時間複雜度:插入和删除元素O(1),查詢某個元素O(n)

資料結構:棧、隊列、雙端隊列、優先隊列

具體實作和常用方法請看雙端隊列Java官方文檔

示例代碼:

//建立Deque的實作類LinkedList執行個體
		Deque<String> deque = new LinkedList<String>();
		deque.addFirst("a");//在隊頭添加元素
		deque.addFirst("b");
		deque.addFirst("c");
		System.out.println(deque);
		
		String string = deque.getFirst();//查詢隊頭第一個元素
		System.out.println(string);
		System.out.println(deque);
		
		//周遊隊列
		while (deque.size()>0) {
			System.out.println(deque.removeFirst());//查詢并删除隊頭第一個元素
		}
		System.out.println(deque);
           

運作結果:

[c, b, a]
c
[c, b, a]
c
b
a
[]
           

四、優先隊列PriorityQueue

特性:和棧與隊列不同,不在是先入後出或先入先出,而是按照元素優先級出

時間複雜度:插入操作為O(1),取出操作為O(logn)【按照元素優先級取出】

優先隊列底層具體實作的資料結構較為多樣和複雜,可以使用heap堆、bst二叉搜尋樹、treap樹堆來實作

具體實作和常用方法請看優先隊列Java官方文檔