隊列數據結構Java實現

隊列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,只允許在表的後端(rear)進行插入操作。 

1.隊列的順序存儲結構及實現 

public class SequenceQueue<T>
{
	private int DEFAULT_SIZE = 10;
	//保存數組的長度。
	private int capacity;
	//定義一個數組用於保存順序隊列的元素
	private Object[] elementData;
	//保存順序隊列中元素的當前個數
	private int front = 0;
	private int rear = 0;
	//以默認數組長度創建空順序隊列
	public SequenceQueue()
	{
		capacity = DEFAULT_SIZE;
		elementData = new Object[capacity];
	}
	//以一個初始化元素來創建順序隊列
	public SequenceQueue(T element)
	{
		this();
		elementData[0] = element;
		rear++;
	}
	/**
	 * 以指定長度的數組來創建順序隊列
	 * @param element 指定順序隊列中第一個元素
	 * @param initSize 指定順序隊列底層數組的長度
	 */
	public SequenceQueue(T element , int initSize)
	{
		this.capacity = initSize;
		elementData = new Object[capacity];
		elementData[0] = element;
		rear++;
	}
	//獲取順序隊列的大小
	public int length()
	{
		return rear - front;
	}
	//插入隊列
	public void add(T element)
	{
		if (rear > capacity - 1)
		{
			throw new IndexOutOfBoundsException("隊列已滿的異常");
		}
		elementData[rear++] = element;
	}
	//移除隊列
    public T remove()
	{
		if (empty())
		{
			throw new IndexOutOfBoundsException("空隊列異常");
		}
		//保留隊列的rear端的元素的值
		T oldValue = (T)elementData[front];
		//釋放隊列的rear端的元素
		elementData[front++] = null; 
		return oldValue;
	}
	//返回隊列頂元素,但不刪除隊列頂元素
    public T element()
	{
		if (empty())
		{
			throw new IndexOutOfBoundsException("空隊列異常");
		}
		return (T)elementData[front];
	}
	//判斷順序隊列是否爲空隊列
	public boolean empty()
	{
		return rear == front;
	}
	//清空順序隊列
	public void clear()
	{
		//將底層數組所有元素賦爲null
		Arrays.fill(elementData , null);
		front = 0;
		rear = 0;
	}
	public String toString()
	{
		if (empty())
		{
			return "[]";
		}
		else
		{
			StringBuilder sb = new StringBuilder("[");
			for (int i = front  ; i < rear ; i++ )
			{
				sb.append(elementData[i].toString() + ", ");
			}
			int len = sb.length();
			return sb.delete(len - 2 , len).append("]").toString();
		}
	}
}
2.循環隊列(順序結構存儲實現) 

import java.util.Arrays;
public class LoopQueue<T>
{
	private int DEFAULT_SIZE = 10;
	//保存數組的長度。
	private int capacity;
	//定義一個數組用於保存循環隊列的元素
	private Object[] elementData;
	//保存循環隊列中元素的當前個數
	private int front = 0;
	private int rear = 0;
	//以默認數組長度創建空循環隊列
	public LoopQueue()
	{
		capacity = DEFAULT_SIZE;
		elementData = new Object[capacity];
	}
	//以一個初始化元素來創建循環隊列
	public LoopQueue(T element)
	{
		this();
		elementData[0] = element;
		rear++;
	}
	/**
	 * 以指定長度的數組來創建循環隊列
	 * @param element 指定循環隊列中第一個元素
	 * @param initSize 指定循環隊列底層數組的長度
	 */
	public LoopQueue(T element , int initSize)
	{
		this.capacity = initSize;
		elementData = new Object[capacity];
		elementData[0] = element;
		rear++;
	}
	//獲取循環隊列的大小
	public int length()
	{
		if (empty())
		{
			return 0;
		}
		return rear > front ? rear - front 
			: capacity - (front - rear);
	}
	//插入隊列
	public void add(T element)
	{
		if (rear == front 
			&& elementData[front] != null)
		{
			throw new IndexOutOfBoundsException("隊列已滿的異常");
		}
		elementData[rear++] = element;
		//如果rear已經到頭,那就轉頭
		rear = rear == capacity ? 0 : rear;
	}
	//移除隊列
	public T remove()
	{
		if (empty())
		{
			throw new IndexOutOfBoundsException("空隊列異常");
		}
		//保留隊列的rear端的元素的值
		T oldValue = (T)elementData[front];
		//釋放隊列的rear端的元素
		elementData[front++] = null; 
		//如果front已經到頭,那就轉頭
		front = front == capacity ? 0 : front;
		return oldValue;
	}
	//返回隊列頂元素,但不刪除隊列頂元素
	public T element()
	{
		if (empty())
		{
			throw new IndexOutOfBoundsException("空隊列異常");
		}
		return (T)elementData[front];
	}
	//判斷循環隊列是否爲空隊列
	public boolean empty()
	{
		//rear==front且rear處的元素爲null
		return rear == front 
			&& elementData[rear] == null;
	}
	//清空循環隊列
	public void clear()
	{
		//將底層數組所有元素賦爲null
		Arrays.fill(elementData , null);
		front = 0;
		rear = 0;
	}
	public String toString()
	{
		if (empty())
		{
			return "[]";
		}
		else
		{
			//如果front < rear,有效元素就是front到rear之間的元素
			if (front < rear)
			{
				StringBuilder sb = new StringBuilder("[");
				for (int i = front  ; i < rear ; i++ )
				{
					sb.append(elementData[i].toString() + ", ");
				}
				int len = sb.length();
				return sb.delete(len - 2 , len).append("]").toString();
			}
			//如果front >= rear,有效元素爲front->capacity之間、0->front之間的
			else
			{
				StringBuilder sb = new StringBuilder("[");
				for (int i = front  ; i < capacity ; i++ )
				{
					sb.append(elementData[i].toString() + ", ");
				}
				for (int i = 0 ; i < rear ; i++)
				{
					sb.append(elementData[i].toString() + ", ");
				}
				int len = sb.length();
				return sb.delete(len - 2 , len).append("]").toString();
			}
		}
	}
}
3.隊列的鏈式存儲結構及實現 

public class LinkQueue<T>
{
	//定義一個內部類Node,Node實例代表鏈隊列的節點。
	private class Node
	{
		//保存節點的數據
		private T data;
		//指向下個節點的引用
		private Node next;
		//無參數的構造器
		public Node()
		{
		}
		//初始化全部屬性的構造器
		public Node(T data ,  Node next)
		{
			this.data = data;
			this.next = next;
		}
	}
	//保存該鏈隊列的頭節點
	private Node front;
	//保存該鏈隊列的尾節點
	private Node rear;
	//保存該鏈隊列中已包含的節點數
	private int size;
	//創建空鏈隊列
	public LinkQueue()
	{
		//空鏈隊列,front和rear都是null
		front = null;
		rear = null;
	}
	//以指定數據元素來創建鏈隊列,該鏈隊列只有一個元素
	public LinkQueue(T element)
	{
		front = new Node(element , null);
		//只有一個節點,front、rear都指向該節點
		rear = front;
		size++;
	}
	//返回鏈隊列的長度	
	public int length()
	{
		return size;
	}
	//將新元素加入隊列
	public void add(T element)
	{
		//如果該鏈隊列還是空鏈隊列
		if (front == null)
		{
			front = new Node(element , null);
			//只有一個節點,front、rear都指向該節點
			rear = front;
		}
		else
		{
			//創建新節點
			Node newNode = new Node(element , null);
			//讓尾節點的next指向新增的節點
			rear.next = newNode;
			//以新節點作爲新的尾節點
			rear = newNode;
		}
		size++;
	}
	//刪除隊列front端的元素
	public T remove()
	{
		Node oldFront = front;
		front = front.next;
		oldFront.next = null;
		size--;
		return oldFront.data;
	}
	//訪問鏈式隊列中最後一個元素
	public T element()
	{
		return rear.data;
	}
	//判斷鏈式隊列是否爲空隊列
	public boolean empty()
	{
		return size == 0;
	}
	//清空鏈隊列
	public void clear()
	{
		//將front、rear兩個節點賦爲null
		front = null;
		rear = null;
		size = 0;
	}
	public String toString()
	{
		//鏈隊列爲空鏈隊列時
		if (empty())
		{
			return "[]";
		}
		else
		{
			StringBuilder sb = new StringBuilder("[");
			for (Node current = front ; current != null
				; current = current.next )
			{
				sb.append(current.data.toString() + ", ");
			}
			int len = sb.length();
			return sb.delete(len - 2 , len).append("]").toString();
		}
	}
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章