1. 程式人生 > >Java中棧和佇列的類

Java中棧和佇列的類

Stack類:棧類  過時    public class Stack<E> extends Vector<E>
Queue:佇列類
Deque:雙端佇列(棧操作建議使用)
 
public class LinkedList<E> 
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
 
 
public interface Deque<E> extends Queue<E>   擴充套件了java.util.Collection介面

雙端佇列

public interface Queue<E> extends Collection<E>  

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

所以Java中實現棧和佇列操作都可以通過使用LinkedList類實現,當然底層使用的連結串列。

public class ArrayDeque<E> extends AbstractCollection<E>
                           implements Deque<E>, Cloneable, Serializable
 
ArrayDeque是Deque 介面的大小可變陣列的實現
 
/**
 * 功能:模擬生活中羅盤子案例
 * 技能:LinkedList
 * 
 * LinkedList既可以當做線性表處理,也可以當做棧、佇列使用
 * @author Administrator*
 */
public class TestDeque {
 
	public static void main(String[] args) {
		//建立一個棧
		Deque deque =  new LinkedList();		
		//羅盤子:入棧
//		deque.addFirst("盤子1");
//		deque.addFirst("盤子2");
//		deque.addFirst("盤子3");
		deque.push("盤子1");
		deque.push("盤子2");
		deque.push("盤子3");		
		//獲取最上面的盤子:獲取棧頂元素
//		System.out.println(deque.getFirst());
//		System.out.println(deque.getFirst());
//		System.out.println(deque.getFirst());
		System.out.println(deque.peek());
		System.out.println(deque.peek());
		System.out.println(deque.peek());		
		//拿走盤子:出棧
//		System.out.println(deque.removeFirst());
//		System.out.println(deque.removeFirst());
//		System.out.println(deque.removeFirst());
		System.out.println(deque.pop());
		System.out.println(deque.pop());
		System.out.println(deque.pop());
 
	}
 
}

/**
 * 功能:模擬生活中超市購物排隊結算
 * 技能:使用LinkedList實現佇列的操作
 * 
 * @author Administrator
 *
 */
public class TestQueue {
	public static void main(String[] args) {
		//建立一個佇列
		java.util.Queue queue = new LinkedList();		
		//入隊
		queue.offer("張三");
		queue.offer("李四");
		queue.offer("王五");
		//獲取隊頭元素
		System.out.println(queue.element());
		System.out.println(queue.element());
		System.out.println(queue.element());
		//出隊
		System.out.println(queue.remove());
		System.out.println(queue.poll());
		queue.offer("趙六");
		System.out.println(queue.poll());
		System.out.println(queue.poll());
		System.out.println(queue.poll());
		System.out.println(queue.poll());
		System.out.println(queue.poll());
	}
}

/**
 * 藉助棧實現進位制轉換(10----2)
 * @author Administrator
 *
 */
public class TestConversion {
	public static void main(String[] args) {		
		int n = 13;
		int t = n;
		//String str = "";
		Deque<Integer>  deque = new LinkedList<Integer>();
		while(t>0){
			//除以2得到餘數作為二進位制位
			int mod = t%2;
			//System.out.print(mod);
			//str = mod + str;
			deque.push(mod);
			//除以2得到商作為被除數繼續
			int result = t/2;
			t = result;
		}
		System.out.print(n+"--------->");
		while(!deque.isEmpty()){
			System.out.print(deque.pop());
		}		
	}
}

總之:

1、深入理解pop的深層含義

2、分清是棧還是堆,以及二者的區別:

①:棧是後進先出,使用的關鍵詞是:pop,push和peek

②:堆是先進先出,使用的關鍵詞是:enqueue、dequeue和peek