天天看點

第十五章 泛型

仿造《Java程式設計思想》中鍊式堆棧類,實作一個鍊式隊列

1. 首先需要一個通用的結點類

public class Node<T> {

	private T item;// 存儲的資料
	private Node<T> next;// 下一個節點的引用

	public Node(T item) {
		super();
		this.item = item;
	}

	public T getItem() {
		return item;
	}

	public void setItem(T item) {
		this.item = item;
	}

	public Node<T> getNext() {
		return next;
	}

	public void setNext(Node<T> next) {
		this.next = next;
	}

}
           

2. 實作鍊式隊列

/**
 * 鍊式隊列
 * <p>
 * 入隊列->tail......head->出隊列
 * 
 * @author fengbin
 *
 * @param <T>
 */
public class LinkedQueue<T> {

	private Node<T> head;// 頭結點
	private Node<T> tail;// 尾結點
	private int size = 0;// 隊列大小

	/**
	 * <ul>
	 * <li>入隊列,如果size=0,頭尾相同;
	 * <li>如果size>1,則頭不變,尾變;
	 * <li>如果size=1,因為頭尾指向同一對象,隻需要将尾的next改變,同時尾變
	 * </ul>
	 * 
	 * @param item
	 */
	public void push(T item) {
		Node<T> node = new Node<>(item);
		if (size == 0) {
			head = tail = node;
		} else {
			tail.setNext(node);
			tail = node;
		}
		size++;
	}

	/**
	 * <ul>
	 * <li>出隊列,如果size=0,則傳回null;
	 * <li>否則,傳回head的item資訊,同時将head指向next
	 * <ul>
	 * 
	 * @return
	 */
	public T pop() {
		if (size == 0)
			return null;
		T data = head.getItem();
		head = head.getNext();
		size--;
		return data;
	}

	public static void main(String[] args) {
		LinkedQueue<String> queue = new LinkedQueue<>();
		for (String s : "Hello world !!!".split(" "))
			queue.push(s);
		String s;
		while ((s = queue.pop()) != null)
			System.out.println(s);
	}
}