您的位置:首页 > 产品设计 > UI/UE

【算法导论学习-18】queue的数组实现

2014-08-23 18:34 525 查看
参考:http://zengzhaoshuai.iteye.com/blog/1171716

这里指的是循环队列。

先写一个接口:

/**
* 创建时间:2014年8月23日 下午5:28:15
* 项目名称:Test
* @author Cao Yanfeng
* @since JDK 1.6.0_21
* 类说明:  queue的接口
*/

public interface QueueIntereface<T> {
/*入队*/
void enqueue(T element);
/*出队*/
T dequeue();
boolean isEmpty();
boolean isFull();
}
以数组为内核写一个顺序存储的循环队列,注意,这里循环队列的队空与队满的判断条件:

队空:head==tail&&Q.tail==null

队满:head==tail&&Q.head!=null

传统的判断方法是用两种方式:

1):设置计数器head==tail&&counter==Q.length,表明队满,否则head==tail&&counter<Q.length队为空;

2):少用一个空间,队空时, front=rear; 队满时,(rear+1)%Q.length=front

/**
* 创建时间:2014年8月23日 下午5:32:31
* 项目名称:Test
* @author Cao Yanfeng
* @since JDK 1.6.0_21
* 类说明:  循环队列,以数组为内核的顺序存储
*/

public class MyQueue<T> implements QueueIntereface<T> {
private static int DEFAULT_SIZE = 4;
private int capacity;
private Object[] elementData;
private int head;
private int tail;

public MyQueue() {
// TODO Auto-generated constructor stub
head=tail=0;
capacity=DEFAULT_SIZE;
elementData=new Object[capacity];
}
public MyQueue(int capacity) {
// TODO Auto-generated constructor stub
head=tail=0;
this.capacity=capacity;
elementData=new Object[capacity];
}

@Override
public void enqueue(T element) {
// TODO Auto-generated method stub
if (isFull()) {
throw new IndexOutOfBoundsException("队列已满的异常");
}
elementData[tail++]=element;
tail=tail==capacity?0:tail;
}

@Override
public T dequeue() {
// TODO Auto-generated method stub
if (isEmpty()) {
throw new IndexOutOfBoundsException("空队列异常");
}
@SuppressWarnings("unchecked")
T oldElement=(T)elementData[head];
elementData[head++]=null;
head=head==capacity?0:head;
return oldElement;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return head==tail&&elementData[tail]==null;
}
@Override
public boolean isFull() {
// TODO Auto-generated method stub
return head==tail&&elementData[head]!=null;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐