1. 程式人生 > >Java之用棧實現隊列

Java之用棧實現隊列

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之用棧實現隊列