[数据结构]P1.2 队列
* 注: 本文/本系列谢绝转载,如有转载,本人有权利追究相应责任。 2019年4月8日
Stan Zhang 2019年4月8日 格物致知,经世致用。
队列是一种先进先出FIFO的模型,常见操作有: push、pull 获得队列出口首元素并从队列中删除、peek 查看队列出口首元素,不从队列中删除。
队列与其他线性结构一样,可以使用数组或者链表实现,这里使用数组实现。
使用数组实现队列长度必然是固定的,因此规定当队列存满之后不再进行扩容,只是提示。
队列中为了充分使用数据空间,首尾指针采用与数组长度求模的方式进行添加和删除。
Java代码:
package ds2.queue; public class ArrayQueue { static class Queue{ int maxSize; int queSize; long[] data ; int head; // 头索引 int tail; // 尾索引 public Queue(int maxSize) { this.maxSize = maxSize; this.data = new long[maxSize]; this.head = 0; this.tail = -1; } public boolean isFull(){ return maxSize == queSize; } public boolean isEmpty(){ return queSize == 0; } /** * 向尾部加数据 * 线性时间 * @param data */ public void push(long data){ if(isFull()){ System.out.println("The element cann't be inserted owing to the queue is full!"); }else{ this.tail = (this.tail + 1)%this.data.length; this.data[this.tail] = data; this.queSize ++ ; } } /** * 从头部取数据,线性时间 * @return */ public long peek(){ return this.data[this.head]; } /** * 从头部取数据 * @return */ public long pull(){ long data = this.data[this.head]; this.head = (this.head + 1)%this.data.length; this.queSize --; return data; } public void foreachPrint(){ if(this.isEmpty()){ System.out.println("[]"); return; } System.out.print("[" + this.data[this.head]); for(int i = 1,j = this.head + 1; i < queSize; i++,j++){ System.out.print("," + this.data[j%this.data.length]); } System.out.println("]"); } } public static void main(String[] args) { Queue queue = new Queue(4); queue.push(1); queue.foreachPrint(); queue.push(2); queue.foreachPrint(); queue.push(3); queue.foreachPrint(); queue.push(4); queue.foreachPrint(); queue.push(5); queue.foreachPrint(); System.out.println(queue.peek()); queue.foreachPrint(); System.out.println(queue.pull()); queue.foreachPrint(); System.out.println(queue.pull()); queue.foreachPrint(); queue.push(5); queue.foreachPrint(); queue.push(6); queue.foreachPrint(); } }
result::
[1] [1,2] [1,2,3] [1,2,3,4] The element cann't be inserted owing to the queue is full! [1,2,3,4] 1 [1,2,3,4] 1 [2,3,4] 2 [3,4] [3,4,5] [3,4,5,6]