底层数组;
数据是先进先出,像排队一样。
/** * 循环队列,顺序储存 * 底层是数组 * 不管是入队还是出队,都是向数组下一项移动的,可以这样:新的数组下标 = (没移动前的下标 + 1) % 数组长度 * 比如: * 数组长度为6,队头在数组下标为3的位置即数组最后,队尾在数组下标为5的位置即数组最后; * 再入队,队尾要跑到数组下标为0的位置即数组开头,number = (5 + 1) % 6 = 0; * 出队也是这样。 */ public class Queue<E> { // 数组 private Object[] array; // 数组总长度,一共可以储存19个元素 private int len = 20; // 队头 private int front = 0; // 队尾 private int rear = 0; // 队列中储存元素的个数 private int size = 0; // 初始化数组 public Queue(){ array = new Object[len]; } // 初始化队列长度 public Queue(int len){ this.len = len; array = new Object[len]; } // 获取元素个数 public int getSize(){ return size; } // 入队 public void enQueue(E e){ // 判断队列是否满了 if(size != len - 1){ array[rear] = e; rear = (rear + 1) % len; // 实现循环入队 size ++; } else System.out.println("抱歉,队列已满,无法存入"); } // 队头元素出队 public E deQueue(){ // 判断队内是否有元素 E e = null; if(size != 0){ e = (E) array[front]; front = (front + 1) % len; // 实现循环队列入队 size --; } return e; } // 获取队头元素 public E getHead(){ E e = null; if(size != 0) e = (E)array[front]; return e; } // 获取队尾 public E getLast(){ E e = null; if(size != 0){ if(rear != 0) e = (E)array[rear - 1]; else e = (E)array[len - 1]; } return e; } }
public class Demo { // 输出相关数据 public static void print(Queue queue){ System.out.println("队内元素个数:" + queue.getSize()); System.out.println("队头:" + queue.getHead()); System.out.println("队尾:" + queue.getLast()); } public static void main(String[] args){ Queue<String> queue = new Queue<>(5); // 入队 queue.enQueue("1"); queue.enQueue("2"); queue.enQueue("3"); queue.enQueue("4"); print(queue); // 出队 queue.deQueue(); queue.deQueue(); print(queue); // 入队 queue.enQueue("5"); queue.enQueue("6"); print(queue); // 入队 queue.enQueue("7"); print(queue); } }
结果: 队内元素个数:4 队头:1 队尾:4 队内元素个数:2 队头:3 队尾:4 队内元素个数:4 队头:3 队尾:6 抱歉,队列已满,无法存入 队内元素个数:4 队头:3 队尾:6