1. 程式人生 > >stack,deque,queue對比

stack,deque,queue對比

1.stack堆疊,沒有迭代器,支援push()方法。後進先出,top()返回最頂端的元素,pop()剔除最頂元素,後進先出(LIFO);

2.deque雙端佇列,支援迭代器,有push_back()方法,跟vector差不多,比vector多了個pop_front,push_front方法;

3.queue佇列,先進先出,不支援迭代器佇列通常(但並非一定)以 FIFO(先進先出)的方式排序各個元素Queue使用時要儘量避免Collection的add()和remove()方法而是要使用offer()來加入元素,使用poll()來獲取並移出元素。它們的優點是通過返回值可以判斷成功與否,add()和remove()方法在失敗的時候會丟擲異常

 如果要使用前端而不移出該元素,使用element()或者peek()方法。

Stack的例子:

public static void main(String[] args) {
		Stack st = new Stack();
		System.out.println("st的hashCode:"+st.hashCode());
		st.push("wce");
		st.push(12.8f);
		st.push(true);
		System.out.println(st);
		System.out.println(st.peek()+"--------");
//		System.out.println(st.empty());
		System.out.println(st.search("wce"));
		st.pop();
		System.out.println(st);
	}



注意:這都只是介面而已

1、Queue

API

在java5中新增加了java.util.Queue介面,用以支援佇列的常見操作。該介面擴充套件了java.util.Collection介面。

Java程式碼  收藏程式碼
  1. public interface Queue<E>   
  2.     extends Collection<E>  

 除了基本的 Collection 操作外,佇列還提供其他的插入、提取和檢查操作。

每個方法都存在兩種形式:一種丟擲異常(操作失敗時),另一種返回一個特殊值(null 或 false,具體取決於操作)


 

佇列通常(但並非一定)以 FIFO(先進先出)的方式排序各個元素。不過優先順序佇列和 LIFO 佇列(或堆疊)例外,前者根據提供的比較器或元素的自然順序對元素進行排序,後者按 LIFO(後進先出)的方式對元素進行排序。

在 FIFO 佇列中,所有的新元素都插入佇列的末尾,移除元素從佇列頭部移除。

Queue使用時要儘量避免Collection的add()和remove()方法而是要使用offer()來加入元素,使用poll()來獲取並移出元素。它們的優點是通過返回值可以判斷成功與否,add()和remove()方法在失敗的時候會丟擲異常 如果要使用前端而不移出該元素,使用element()或者peek()方法。


 

offer 方法可插入一個元素,否則返回 false。這與 Collection.add 方法不同,該方法只能通過丟擲未經檢查的異常使新增元素失敗。

remove() 和 poll() 方法可移除和返回佇列的頭。到底從佇列中移除哪個元素是佇列排序策略的功能,而該策略在各種實現中是不同的。remove() 和 poll() 方法僅在佇列為空時其行為有所不同:remove() 方法丟擲一個異常,而 poll() 方法則返回 null。

element() 和 peek() 返回,但不移除,佇列的頭。

Queue 實現通常不允許插入 null 元素,儘管某些實現(如 LinkedList)並不禁止插入 null。即使在允許 null 的實現中,也不應該將 null 插入到 Queue 中,因為 null 也用作 poll 方法的一個特殊返回值,表明佇列不包含元素。

值得注意的是LinkedList類實現了Queue介面,因此我們可以把LinkedList當成Queue來用。

Java程式碼  收藏程式碼
  1. import java.util.Queue;    
  2. import java.util.LinkedList;    
  3. public class TestQueue {    
  4.     public static void main(String[] args) {    
  5.         Queue<String> queue = new LinkedList<String>();    
  6.         queue.offer("Hello");    
  7.         queue.offer("World!");    
  8.         queue.offer("你好!");    
  9.         System.out.println(queue.size());    
  10.         String str;    
  11.         while((str=queue.poll())!=null){    
  12.             System.out.print(str);    
  13.         }    
  14.         System.out.println();    
  15.         System.out.println(queue.size());    
  16.     }    
  17. }   
public static void main(String[] args) {
		Queue<Object> queue = new LinkedList<Object>();
		queue.offer("Hello");    
        queue.offer("World!");    
        queue.add("你好!");
        queue.add(false);
        queue.remove();
        System.out.println(queue.size()); 
        System.out.println(queue.peek());
        System.out.println(queue.element()+"--------");
        Object str;    
        while((str=queue.poll())!=null){    
            System.out.println(str);    
        }    
        System.out.println(queue.size());   

	}

2、Deque

API 

Java程式碼  收藏程式碼
  1. public interface Deque<E>  
  2.     extends Queue<E>  

 一個線性 collection,支援在兩端插入和移除元素。

名稱 deque 是“double ended queue(雙端佇列)”的縮寫,通常讀為“deck”。

大多數 Deque 實現對於它們能夠包含的元素數沒有固定限制,但此介面既支援有容量限制的雙端佇列,也支援沒有固定大小限制的雙端佇列。

 

此介面定義在雙端佇列兩端訪問元素的方法。提供插入、移除和檢查元素的方法。因為此介面繼承了佇列介面Queue,所以其每種方法也存在兩種形式:一種形式在操作失敗時丟擲異常,另一種形式返回一個特殊值(null 或 false,具體取決於操作)。

a、在將雙端佇列用作佇列時,將得到 FIFO(先進先出)行為。將元素新增到雙端佇列的末尾,從雙端佇列的開頭移除元素。從 Queue 介面繼承的方法完全等效於 Deque 方法,如下表所示:


 

b、用作 LIFO(後進先出)堆疊。應優先使用此介面而不是遺留 Stack 類在將雙端佇列用作堆疊時,元素被推入雙端佇列的開頭並從雙端佇列開頭彈出。堆疊方法完全等效於 Deque 方法,如下表所示:



public static void main(String[] args) {
		Deque<Object> d = new LinkedList<Object>();
		d.addFirst("ads");
		d.addFirst(234.4f);
		d.offerFirst(true);
		d.offerFirst('e');
		
		d.addLast(false);;
		d.addLast(982l);
		d.offerLast("rv");
		d.offerLast(9);
		d.offerLast("oiu");
		System.out.println(d);
		
		d.removeFirst();
		System.out.println(d+"---1-");
		d.pollFirst();
		System.out.println(d+"---2-");
		
		d.removeLast();
		System.out.println(d+"---3-");
		d.pollLast();
		System.out.println(d+"---4-");
		
		System.out.println(d.getFirst()+"---5-");
		System.out.println(d.peekFirst()+"---6-");
		
		System.out.println(d.getLast()+"---7-");
		System.out.println(d.peekLast()+"---8-");
		System.out.println(d+"---9-");

	}
執行結果:

[e, true, 234.4, ads, false, 982, rv, 9, oiu]
[true, 234.4, ads, false, 982, rv, 9, oiu]---1-
[234.4, ads, false, 982, rv, 9, oiu]---2-
[234.4, ads, false, 982, rv, 9]---3-
[234.4, ads, false, 982, rv]---4-
234.4---5-
234.4---6-
rv---7-
rv---8-
[234.4, ads, false, 982, rv]---9-