队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
1、创建队列的接口
package org.nkty.trb.itf;
/**
* 队列
* @author Aitex
* 线式存储
*/
public interface Queue {
/**
* 获取队的大小
* @return
*/
public int getSize();
/**
* 判断队列是否为空
* @return
*/
public boolean isEmpty();
/**
* 入队
* @param e 传入参数
*/
public void enqueue(Object e);
/**
* 出队
* @return 返回队中对象
*/
public Object dequeue();
/**
* 取出队首元素
* @return 返回对中对象
*/
public Object peek();
}
2、实现队列的接口
package org.nkty.trb.impl;
import org.nkty.trb.itf.Queue;
import MyException.MyQueueException;
public class MyQueue implements Queue{
private final static int CAP = 7;//队列的默认大小
private Object[] element;//数据元素数组
private int length;//数组长度
private int frist;//队首指针
private int last;//队尾指针
public MyQueue(){
this(CAP);
}
public MyQueue(int cap){
length = cap+1;
element = new Object[length];
frist = last = 0;
}
@Override
public int getSize() {
// TODO Auto-generated method stub
return (last - frist + length)%length;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return frist == last;
}
@Override
public void enqueue(Object e) {
// TODO Auto-generated method stub
if(getSize() == length-1) expandSpace();
element[last] = e;
last = (last+1)%length;
}
public void expandSpace(){
Object [] a = new Object[element.length*2];
int i = frist; int j = 0;
while(i != last){
a[j++] = element[i];
i = (i+1)%length;
}
element = a;
length =element.length;
frist = 0 ; last = j;//设置新的队首、队尾
}
@Override
public Object dequeue() {
// TODO Auto-generated method stub
if(isEmpty())
throw new MyQueueException("出错!该队列为空!");
Object obj = element[frist];
element[frist] = null;
frist = (frist+1)%length;
return obj;
}
@Override
public Object peek() {
// TODO Auto-generated method stub
if(isEmpty())
throw new MyQueueException("出错!该队列为空!");
return element[frist];
}
}
3、创建自定义异常
package MyException;
public class MyQueueException extends RuntimeException{
/**
*
*/
private static final long serialVersionUID = -6617273264657412593L;
public MyQueueException(String err){
super(err);
}
}
4、例程
package TestDriver;
import org.nkty.trb.impl.MyQueue;
public class Test2 {
public static void main(String[] args) {
String [] string = {"0","1","2","3","4","5","6","7","8","9"};
doTest1(string);
}
/**
* 存入数字0-9,并将该数字打印出来
* @param s
*/
public static void doTest1(String [] s){
MyQueue mq = new MyQueue();
for (int i = 0; i < s.length; i++) {
mq.enqueue(s[i]);
}
while(!mq.isEmpty()) System.out.print(mq.dequeue());
}
}