1.队列基础概念
a.队列也是一种运算受限的线性表。它只允许在表的一端插入(入队),而在另一端进行删除(出队)。
b.允许删除的一端称为队头,允许插入的一端称为队尾。在队列中没有元素时称为空队列。
c.在空队列中依次加入元素a1,a2,...,an之后,a1是对头元素,an是队尾元素。而退栈顺序
也跟入队顺序一样,即先进先出。
d.完成这个效果,需要头指针和尾指针。
2.队列的实现
1)、队列的抽象接口
package org.Stone6762.MQueue;/**
* @ClassName_MQueue
* @author_Stone6762
* @Description_
*/
public interface MQueue {
/**
* @Describe_清空
*/
public void clear();
/**
* @Describe_是否为空
* @return
*/
public boolean isEmpty();
/**
* @Describe_队列的长度
* @return
*/
public int length();
/**
* @Describe_读取对首的元素
* @return
*/
public Object peek();
/**
* @Describe_入队
* @param data
* @throws Exception
*/
public void offer(Object data) throws Exception;
/**
* @Describe_出对
* @return
*/
public Object poll();
}
2)、队列的顺序存储
package org.Stone6762.MQueue.imple;import org.Stone6762.MQueue.MQueue;
/**
* @ClassName_SqQueue顺序队列
* @author_Stone6762
* @Description_
*/
public class SqQueue implements MQueue {
/**
* @queueElem存储队列的元素
*/
private Object queueElem[];
/**
* @rear指向对尾元素的下一个存储位置
*/
private int rear;
/**
* @front指向对首元素
*/
private int front;
public SqQueue(int maxSize) {
queueElem = new Object[maxSize];
rear = front = 0;
}
@Override
public void clear() {
rear = front = 0;
}
@Override
public boolean isEmpty() {
return rear == front;
}
@Override
public int length() {
return front - rear;
}
@Override
public Object peek() {
if (!isEmpty()) {
return queueElem[front];
}
return null;
}
@Override
public void offer(Object data) throws Exception {
if (rear == queueElem.length) {
throw new Exception("队列已满!!!");
} else {
queueElem[rear] = data;
rear++;
}
}
@Override
public Object poll() {
if (isEmpty()) {
return null;
} else {
Object elem = queueElem[front];
front++;
return elem;
}
}
}
3)、队列的链式存储
package org.Stone6762.MQueue.imple;import org.Stone6762.MQueue.MQueue;
import org.Stone6762.entity.Node;
/**
* @ClassName_LinkQueue队列的链式存储
* @author_Stone6762
* @Description_
*/
public class LinkQueue implements MQueue {
/**
* @front指向队首结点
*/
private Node front;
/**
* @rear指向队尾结点
*/
private Node rear;
public LinkQueue() {
front = rear = null;
}
@Override
public void clear() {
front = rear = null;
}
@Override
public boolean isEmpty() {
return front == null;
}
@Override
public int length() {
int length = 0;
if (front != null) {
// 创建一个指针指向队首元素,然后移动该指针,而不是移动队首元素,因为队首元素和队尾元素只有当出对和入队时才移动
Node t = front;
while (t != null) {
t = t.getNext();
length++;
}
}
return length;
}
@Override
public Object peek() {
if (front != null) {
return front.getData();
} else {
return null;
}
}
@Override
public void offer(Object data) throws Exception {
Node newNode = new Node(data);
/*
* 插入第一个元素时必须特殊处理
*/
if (front != null) {
rear.setNext(newNode);
rear = newNode;
} else {
front = rear = newNode;
}
}
@Override
public Object poll() {
if (front != null) {
Node t = front;
front = front.getNext();
/*
* 删除时,对最后一个元素进行判断
*/
if (t == rear) {
rear = null;
}
return t.getData();
} else {
return null;
}
}
}
提醒:链式队列源码下载:
http://www.cnblogs.com/tanlon/p/4039808.html