队列
队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表。允许插入的一端称为队尾,允许删除的一端称为对头 (先进先出的特性)
【1.顺序存储的队列应该把队列的所有元素都存储在数组的前n个单元,此时入队的操作相当于追加,不需要移动元素;但是出队操作的时间开销为O(n)---------->2.放宽队列的所有元素必须存储在前n个单元这一条件,只要求存储在数组中的连续的位置,就可以得到一种更为有效的存储方法,此时入队和出队的操作的时间开销都是O(1),因此需要设置对头、队尾指针,并且约定:对头指针front指向队头元素的前一个位置,队尾指针rear指向队尾元素--------->3.由2的单移动性产生的假溢出,解决办法:将存储队列的数组看成是头尾相接的循环结构,即允许队列直接从数组中下标最大的位置延续到下标最小的位置,队列的这种头尾相接的顺序存储结构称为循环队列】
循环队列类:
package edu.tcu.soft;
public class CirQueue<E> {
// 声明一个对象数组
private Object[] objects=new Object[5];
// 声明队头指针、队尾指针
private int front, rear;
public CirQueue() {
this.front =objects.length-1;
this.rear = objects.length-1;
}
//入队操作
public void enQueue(E e) {
//先判断对列是否满
if(front==(rear+1)%objects.length){
System.out.println("队空间已满");
}else{
rear=(rear+1)%objects.length;//队尾指针在循环意义下加1
objects[rear]=e;
}
}
//出对操作
@SuppressWarnings("unchecked")
public E deQueue(){
//先判断对列内是否有元素
if(front==rear){
System.out.println("队列内没有元素");
}else{
front=(front+1)%objects.length;//对头指针在循环意义下加1
return (E)objects[front];//读取并返回出队前的对头元素
}
return null;
}
//获取对头的元素
@SuppressWarnings("unchecked")
public E getQueueTop(){
if(front==rear){
System.out.println("队列内没有元素");
}else{
int i=(front+1)%objects.length;//对头指针在循环意义下加1
return (E) objects[i];//读取并返回出队前的对头元素
}
return null;
}
}
测试类:
package edu.tcu.soft;
public class Test {
public static void main(String[] args) {
CirQueue<Integer> queue=new CirQueue<Integer>();
queue.enQueue(1);
queue.enQueue(2);
queue.enQueue(3);
queue.enQueue(4);
queue.deQueue();
queue.deQueue();
queue.enQueue(5);
queue.enQueue(6);
queue.deQueue();
queue.deQueue();
queue.enQueue(7);
queue.enQueue(8);
System.out.println(queue.getQueueTop()+"---");
}
}