队列是一种特殊的线性表,其特性体现在队列只允许在表尾插入数据元素,在表头删除元素,所以队列是一种操作受限的线性表,具有先进先出的特点。允许进行插入的一端称为队尾,允许进行删除的一端称为队首。队列也分为顺序和链式两种存储结构。如下为队列接口的代码:
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、优先级队列
优先级队列是一种带有优先级的队列,它是一种比栈和队列更为专用的数据结构。与普通队列一样,优先级队列有一个队首和队尾,并且也是从队首删除元素,但不同的是优先级队列中数据元素案关键字的值有序排列。