/**
* 文件名:QueueText.java
* 時間:2014年10月22日下午9:05:13
* 作者:修維康
*/
package chapter3;
/**
* 類名:ArrayQueue
* 說明:隊列的數組實現
*/
class ArrayQueue<AnyType>{
private static final int DEFAULT_CAPACITY = 10;
private int front;//隊頭
private int rear;//隊尾
private int theSize;
private AnyType[] theItems;
public ArrayQueue(){
clear();
}
public void clear(){
front = 0;
rear = 0;
theSize = 0;
ensureCapacity(DEFAULT_CAPACITY);
}
public boolean isEmpty(){
return theSize == 0;//or front == rear;
}
public void enqueue(AnyType x){
theItems[rear++] = x;
theSize++;
}
public AnyType dequeue(){
if(theSize == 0)
return null;
theSize--;
return theItems[front++];
}
//返回隊列前面的元素
public AnyType element(){
if(isEmpty())
return null;
return theItems[front];
}
/**
* 方法名:ensureCapacity
* 說明:確保容量
*/
public void ensureCapacity(int newCapacity){
if(newCapacity < theSize)
return;
AnyType[] old = theItems;
theItems = (AnyType[]) new Object[newCapacity];
for(int i = 0;i < theSize;i++)
theItems[i] = old[i];
}
}
/**
* 類名:CirArrQueue
* 說明:循環隊列 (因爲用數組實現的隊列在刪除的時候指針會後移 這樣導致了前面的浪費,
* 循環數組可以解決這個問題,但是循環隊列可能使得運行時間加倍)
*/
class CirArrQueue<AnyType>{
private static final int DEFAULT_CAPACITY = 3;
private int front;//隊頭
private int rear;//隊尾
private int theSize;
private AnyType[] theItems;
public CirArrQueue(){
clear();
}
public void clear(){
theItems = (AnyType[]) new Object[DEFAULT_CAPACITY];
front = 0;
rear = 0;
theSize = 0;
}
public boolean isEmpty(){
return theSize == 0;//or front == rear;
}
public boolean enqueue(AnyType x){
if(theSize == DEFAULT_CAPACITY)
return false;
theItems[rear++] = x;
theSize++;
if(rear == DEFAULT_CAPACITY)//如果到了尾部則回到0
rear = 0;
return true;
}
public AnyType dequeue(){
if(theSize == 0)
return null;
theSize--;
AnyType temp = theItems[front];
if(++front == DEFAULT_CAPACITY)//如果加1超過了數組 則返回到0;
front = 0;
return temp;
}
//返回隊列前面的元素
public AnyType element(){
if(isEmpty())
return null;
return theItems[front];
}
}
/**
* 類名:LinkedQueue
* 說明:鏈表實現隊列
*/
class LinkedQueue<AnyType>{
private static class Node<AnyType> {
Node(AnyType data, Node<AnyType> next) {
this.data = data;
this.next = next;
}
private AnyType data;
private Node<AnyType> next;
}
private Node<AnyType> front;
private Node<AnyType> rear;
public LinkedQueue(){
clear();
}
public void clear(){
front = null;
rear = null;
}
public boolean isEmpty(){
return front == null;
}
public void enqueue(AnyType x){
if(front == null&&rear == null){//最開始的時候
rear = new Node<AnyType>(x,null);
front = rear;
}else{
Node<AnyType> p = new Node<AnyType>(x,null);
rear.next = p;
rear = p;;
}
}
public AnyType dequeue(){
if(!isEmpty()){
AnyType x = front.data;
front = front.next;
return x;
}
return null;
}
public AnyType element(){
if(!isEmpty())
return front.data;
return null;
}
}
/**
* 類名:QueueText
* 說明:隊列的數組和鏈表實現及循環隊列的數組實現
*/
public class QueueText {
/**
* 方法名:main
* 說明:測試
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
/****數組隊列測試*****/
/*ArrayQueue<Integer> q = new ArrayQueue<Integer>();
q.enqueue(1);
q.enqueue(2);
q.enqueue(3);
q.enqueue(4);
System.out.println(q.element());
while(!q.isEmpty())
System.out.println(q.dequeue());
/*********鏈表隊列測試**********/
/*LinkedQueue<Integer> q2 = new LinkedQueue<Integer>();
q2.enqueue(1);
q2.enqueue(2);
q2.enqueue(3);
q2.enqueue(4);
System.out.println(q2.element());
while(!q2.isEmpty())
System.out.println(q2.dequeue());
/***********循環隊列測試************/
CirArrQueue<Integer> q3 = new CirArrQueue<Integer>();
q3.enqueue(1);
q3.enqueue(2);
q3.enqueue(3);
q3.dequeue();
q3.enqueue(4);//設置默認容量爲3,開始時3個,隊列滿了,後來刪除第一個,隊列數組裏第一個空出來了,4進入了,但是還是滿足先進先出的原則,加上 //size的控制,使其不會覆蓋後面的
q3.enqueue(5);//沒有進去
System.out.println(q3.element());
while(!q3.isEmpty())
System.out.println(q3.dequeue());
}
}
JAVA實現數組隊列,循環數組隊列,鏈式隊列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.