1. 什么是队列?
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
2. 队列的特点:
队列是一种先进先出(First In First out)的线性表,允许插入的一端称为队尾,允许删除的一端称为队头。
3. 队列顺序存储有什么不足?
使用数组实现的顺序存储,当做出队列操作时,所有的元素都需要向前移动一位,性能很低。
4. 什么是循环队列?
队列头尾相接的顺序存储结构称为循环队列。
如图所示:front记住队头元素下标,rear记住队尾元素的下一个元素。
注意:
1. 只凭等式front=rear是无法判断队空还是队满,所以我们约定当队列头指针front在队尾指针rear的下一个位置上时,作为队列"已满"的标志, 当队列满时,数组中还会有一个空闲位置。
2. 我们也可以设置一个标志变量flag,当(front == rear && flag == 0) 队列为空, 当(front == rear && flag == 1)队列为满。
5. Java使用数组实现循环队列:
public class LoopQueue<T> { private Object[] arr; private int front; private int rear; private static final int DEFAULT_SIZE = 3 ; public LoopQueue() { this (DEFAULT_SIZE); } public LoopQueue( int size) { arr = new Object[size]; front = 0 ; rear = 0 ; } public boolean enqueue(T data) { if ((rear + 1 ) % arr.length == front) { System.out.println("队列已满,无法入队.." ); return false ; } arr[rear] = data; System.out.println(data + "入队.." ); rear = (rear + 1 ) % arr.length; return true ; } @SuppressWarnings ( "unchecked" ) public T dequeue() { if (rear == front) { System.out.println("队列已空,无法出队.." ); return null ; } Object data = arr[front]; System.out.println(data + "出队.." ); front = (front + 1 ) % arr.length; return (T) data; } public int size() { return (rear - front + arr.length) % arr.length; } public static void main(String[] args) { LoopQueue<String> queue = new LoopQueue<String>(); queue.enqueue("张三" ); queue.dequeue(); queue.enqueue("李四" ); queue.enqueue("王五" ); queue.enqueue("赵六" ); queue.dequeue(); queue.enqueue("田七" ); queue.dequeue(); queue.enqueue("周八" ); System.out.println("队列中元素个数为: " + queue.size()); } }
6. 循环队列的不足:
如果只是顺序存储,算法的性能不咋的,但是循环队列却不得不面临数组可能溢出的问题,有什么好的解决办法吗?
请见下节 -- 链队列 ,未完待续 . . .