隊列是一種特殊的線性表,其特性體現在隊列只允許在表尾插入數據元素,在表頭刪除元素,所以隊列是一種操作受限的線性表,具有先進先出的特點。允許進行插入的一端稱爲隊尾,允許進行刪除的一端稱爲隊首。隊列也分爲順序和鏈式兩種存儲結構。如下爲隊列接口的代碼:
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、優先級隊列
優先級隊列是一種帶有優先級的隊列,它是一種比棧和隊列更爲專用的數據結構。與普通隊列一樣,優先級隊列有一個隊首和隊尾,並且也是從隊首刪除元素,但不同的是優先級隊列中數據元素案關鍵字的值有序排列。