隊列(JAVA描述)

       隊列是一種特殊的線性表,其特性體現在隊列只允許在表尾插入數據元素,在表頭刪除元素,所以隊列是一種操作受限的線性表,具有先進先出的特點。允許進行插入的一端稱爲隊尾,允許進行刪除的一端稱爲隊首。隊列也分爲順序和鏈式兩種存儲結構。如下爲隊列接口的代碼:

public interface IQueue {

	public void clear();        //清空隊列的操作
	
	public boolean isEmpty();   //判斷是否爲空
	
	public int length();        //求對列長度
	
	public Object peek();       //讀取隊首元素,並返回其值
	
	public void offer(Object x)throws Exception;   //將數據元素插入,並使其稱爲新的隊尾元素
	
	public Object poll();       //刪除隊首元素並返回其值,若隊列爲空,則返回null
	
}

1、循環順序隊列類的描述:

public class CircleSqQueue implements IQueue{

	private Object[] queueElem;                //隊列存儲空間
	
	private int front;                         //隊首的引用,若隊列不空,指向隊首元素。
	
	private int rear;                          //隊尾的引用,若隊列不空,指向隊尾元素的下一個存儲位置。
	
	public CircleSqQueue(int maxsize) {        //構造函數
		// TODO Auto-generated constructor stub
		front=rear=0;
		queueElem=new Object[maxsize];
	}
	
	@Override
	public void clear() {
		// TODO Auto-generated method stub
		front=rear=0;
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return front==rear;
	}

	@Override
	public int length() {
		// TODO Auto-generated method stub
		return (rear-front+queueElem.length)%queueElem.length;
	}

	@Override
	public Object peek() {
		// TODO Auto-generated method stub
		if(front==rear){
			return null;
		}else
			return queueElem[front];
	}

	@Override
	public void offer(Object x) throws Exception {
		// TODO Auto-generated method stub
		if((rear+1)%queueElem.length==front){
			throw new Exception("隊列已滿!~");
		}else{
			queueElem[rear]=x;
			rear=(rear+1)%queueElem.length;            //修改隊尾指針
		}
		
	}

	@Override
	public Object poll() {
		// TODO Auto-generated method stub
		if(front==rear){
			return null;
		}else{
			Object o=queueElem[front];
			front=(front+1)%queueElem.length;
			return o;                                  //返回隊列的隊首元素
		}
	}
	
	public void display(){
		if(!isEmpty()){
			for(int i=front;i!=rear;i=(i+1)%queueElem.length)
				System.out.println(queueElem[i].toString()+" ");
		}else
			System.out.println("此隊列爲空~!");
	}

}

2、鏈隊列

        隊列的鏈式存儲結構也用不帶頭節點的單鏈表來實現。爲了便於實現入隊和出隊的操作,需要引用兩個指針front和rear來分別指向隊首元素和隊尾元素的結點。

       結點代碼:

public class Node {
	
	public Object data;  //存放節點值
	
	public Node next;    //後繼節點的引用
	
	public Node(){       //無參數的構造器
		this(null,null);
	}
	
	public Node(Object data){            //帶一個參數時的構造函數
		this(data,null);
	}

	public Node(Object data,Node next){  //兩個參數時的構造函數
		this.data=data;
		this.next=next;
	}
	
}

鏈式隊列代碼:

public class LinkQueue implements IQueue {

	private Node front; // 隊首指針
	private Node rear; // 隊尾指針

	public LinkQueue() {
		// TODO Auto-generated constructor stub
		front = rear = null;
	}

	@Override
	public void clear() { // 隊列置空
		// TODO Auto-generated method stub
		front = rear = null;
	}

	@Override
	public boolean isEmpty() { // 判斷隊列是否爲空
		// TODO Auto-generated method stub
		return front == null;
	}

	@Override
	public int length() {
		// TODO Auto-generated method stub
		Node p = front;
		int length = 0;
		while (p != null) {
			p = p.next;
			length++;
		}
		return length;
	}

	@Override
	public Object peek() {
		// TODO Auto-generated method stub
		if (front != null)
			return front.data;
		else
			return null;
	}

	@Override
	public void offer(Object x) throws Exception {
		// TODO Auto-generated method stub
		Node p = new Node(x); // 構造新節點
		if (front != null) {
			rear.next = p;
			rear = p;               //改變隊尾的位置
		}else {
			front=rear=p;
		}
	}

	@Override
	public Object poll() {
		// TODO Auto-generated method stub
		if (front != null) {
			Node p = front;
			front = front.next;
			if (p == rear) // 被刪除的結點是隊尾結點時
				rear = null;
			return p.data;
		} else
			return null;
	}

}

3、優先級隊列

      優先級隊列是一種帶有優先級的隊列,它是一種比棧和隊列更爲專用的數據結構。與普通隊列一樣,優先級隊列有一個隊首和隊尾,並且也是從隊首刪除元素,但不同的是優先級隊列中數據元素案關鍵字的值有序排列。

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