Java之用棧實現隊列
阿新 • • 發佈:2017-08-29
ring idt style enqueue 元素 java 出隊 入隊 span
隊列是一種典型的先進先出數據結構,隊列的實現方式有很多種,比如數組,比如鏈表等,隊列也可以用兩個棧來實現,下面就用兩個棧實現一個隊列。
原理
兩個棧中,一個棧用來入隊,叫他入隊棧,另一個棧用來出隊,叫出隊棧。
當入隊時,我們直接把元素壓入入隊棧。
當出隊時,分兩種情況:
①若出隊棧不為空,則直接出隊棧棧頂元素出棧
②若出隊棧為空,則入隊棧元素依次出棧並壓入出隊棧,然後出隊棧出棧
具體實現
知道了原理後,實現起來就很簡單啦,這裏我們借助JDK中的java.util.stack類來作為我們隊列中的棧,JDK實現的這個棧繼承了Vector類,所以他的底層也是用到了數組。
代碼如下
package com.gdut.ds.queue; import java.util.Stack; /** * 用兩個棧實現隊列 */ public class Queue<T> { /** * 入隊棧 */ private Stack<T> inStack = new Stack<T>(); /** * 出隊棧 */ private Stack<T> outStack = new Stack<T>(); /** * 隊列大小 */ private int size; /** * 入隊 */ public void enqueue(T obj) { inStack.push(obj); size++; } /** * 出隊 * @return */ public T dequeue() { T obj = null; if(outStack.empty()) { while(!inStack.empty()){ outStack.push(inStack.pop()); } } obj = outStack.pop(); size--; return obj; } /** * 隊列的大小 * @return */ public int size() { return size; } /** * 隊列是否為空 * @return */ public boolean empty() { return size == 0; } }
測試
Queue<String> queue = new Queue<>(); queue.enqueue("Hello"); queue.enqueue("My"); queue.enqueue("Name"); queue.enqueue("is"); queue.enqueue("YangHao"); System.out.println(queue.size()); while(!queue.empty()){ System.out.println(queue.dequeue()); }
結果如下
5 Hello My Name is YangHao
當隊列沒有元素時,Stack類會拋一個EmptyStackExcep。
Java之用棧實現隊列