队列

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

 

posted @ 2017-07-10 20:30  鹏达君  阅读(110)  评论(0编辑  收藏  举报