队列的顺序表方式实现:
实现之前的问题?
/*
* 沿用顺序表的实现方法的问题:
* 1、rear=0时,因为队头元素就在数组高端,deQueue()的时间代价O(1),而enQueue()的代价O(n)
* 2、rear=n-1时,因为队头元素又在数组低端,需要移动其余n-1个元素,deQueue()的时间代价O(n),而enQueue()的代价O(1)
* 如何保证队列的连续性同时允许队列的首尾在数组中自由移动,并且可以防止”假溢出“ ->逻辑上形成循环队列
* 判断队列满和空的两种办法:
* 1、用变量记录队列的元素个数,deQueue()和enQueue()时设置这些变量
* 2、牺牲一个元素空间来简化操作提高运行效率,把存储n个元素的数组length设置为n+1
* front = rear ->队列为空
* (rear+1)%size == front ->队列已满
*
*/
/**
* @author Administrator
*
* @param <T> 队列存储类型
*/
public class MyArrQueue<T> {
private int size; //存放队列的数组大小
private int front; //队列头
private int rear; //队列尾
private T[] items; //存放T类型的数组
/** 初始化队列
* @param size
*/
@SuppressWarnings("unchecked")
public MyArrQueue(int size){
this.size = size + 1;
items = (T[])new Object[this.size];
front = rear = 0;
}
/**
* 清空队列
*/
public void clear(){
front = rear;
items = null;
}
/**
* 入队操作
* @param item
* @return
*/
public boolean enQueue(final T item){
if((rear+1)%size == front){
System.out.println("队列已满!");
return false;
}
items[rear] = item;
rear = (rear+1)%size; //循环后移
return true;
}
/**
* 返回队头元素,并删除
* @return
*/
public T deOueue(){
if(front == rear){
throw new java.util.NoSuchElementException();
}
T item = items[front];
front = (front+1)%size;//队头向后移
return item;
}
/**
* 返回队头但不删除
* @return
*/
public T getFront(){
if(front == rear){
throw new java.util.NoSuchElementException();
}
T item = items[front];
return item;
}
public static void main(String[] args) {
MyArrQueue<Integer> queue = new MyArrQueue<Integer>(2);
queue.enQueue(2);
queue.enQueue(3);
System.out.println(queue.getFront());
System.out.println(queue.deOueue());
System.out.println(queue.deOueue());
System.out.println(queue.deOueue());
}
}
队列的链式实现:
/**
* 链式队列
* @author Administrator
*
* @param <T>
*/
public class MyLinkedQueue<T> {
private int size;
private Node<T> front;
private Node<T> rear;
private static class Node<T> {
public Node(T item,Node<T> next) {
data = item;
this.next = next;
}
public T data;
public Node<T> next;
}
public MyLinkedQueue() {
size = 0;
front = rear = null;
}
/**
* 入队
* @param item
* @return
*/
public boolean enQueue(final T item) {
if (rear == null) { //队列为空
front = rear = new Node<T>(item, null);
} else { //添加新元素
rear.next = new Node<T>(item, null);
rear = rear.next;
}
size++;
return true;
}
/**
* 返回队头元素
* @return
*/
public T deQueue() {
Node<T> tmp = front;
final T val = front.data;
if(size == 0) {
System.out.println("队列为空");
return null;
}
front = front.next;
tmp.data = null;
tmp.next = null;
if(front == null) {
//只有一个元素且删除的情况
rear = null;
}
size--;
return val;
}
/**
* 返回队头元素,不删除
* @return
*/
public T getFront() {
if(size == 0) {
System.out.println("队列为空");
return null;
}
final T val =front.data;
return val;
}
/**
* 清空队列
*/
public void clear(){
/* while(front!=null) {
rear = front;
front = front.next;
rear.data = null;
rear = null;
}*/
for(Node<T> tmp = front; tmp != null;) {
Node<T> next = tmp.next;
tmp.data = null; //help GC
tmp.next = null;
tmp = next;
}
front = rear = null;
size = 0;
}
public static void main(String[] args) {
MyLinkedQueue<Integer> queue = new MyLinkedQueue<Integer>();
queue.enQueue(2);
queue.enQueue(3);
System.out.println(queue.getFront());
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
}
}