队列:先进先出(FIFO)——先进队列的元素先出队列。来源于我们生活中的队列(先排队的先办完事)。
队列有下面几个操作:
- initQueue() ——初始化队列
- enQueue() ——进队列
- deQueue() ——出队列
- queueEmpty()——判断队列是否为空
- queueFull() ——判断队列是否已满
队列可以由数组和链表两种形式实现队列操作,下面仅以数组为例:
package com.tangbo;
import java.lang.reflect.Array;
public class Queue<T> {
private int tail;
private int head;
private int length;
private T[] queue;
public Queue(int length) {
iniQueue();//初始化队列
}
@SuppressWarnings("unchecked")
public void iniQueue() {
queue = (T[])Array.newInstance(Object.class, length+1);//队列最后一个始终为空,用来存放尾指针,这个是我个人理解,也只有这样,代码是没有任何问题的!如果大家有什么意见可以和我交流。
tail = head = 0;
this.length = length+1;//同样长度要多一个,最后一个为空,组要是由于判断空和满的需要
}
public void enQueue(T t) {
if(queueFull())
{
System.err.println("队满!");
}else
{
queue[tail] = t;
tail = (tail+1)%length;//采用循环队列的方式
}
}
public T deQueue() {
T t=null;
if(queueEmpty())
{
System.err.println("对空!");
}else
{
t = queue[head];
head = (head+1)%length;
}
return t;
}
public boolean queueFull() {
boolean isFull = false;
if(getQueueLength()==length-1)
{
isFull = true;
}
return isFull;
}
public boolean queueEmpty() {
boolean isEmpty = false;
if(tail == head)
{
isEmpty = true;
}
return isEmpty;
}
public int getTail() {
return tail;
}
public int getHead() {
return head;
}
public T[] getQueue() {
return queue;
}
public int getQueueLength() {
return (tail-head+length)%length;
}
}
测试代码:
package com.tangbo;
public class Test {
public static void main(String[] args) {
Queue<Integer> queue = new Queue<Integer>(2);
queue.enQueue(1);
queue.enQueue(2);
int length = queue.getQueueLength();
for(int i=0;i<length;i++)
{
System.out.println(queue.deQueue());
}
}
}
源码下载:
http://pan.baidu.com/s/1sj9FCmT