队列的特性就如同生活中的排队,谁先排队,谁先处理各种事务(例如超市排队结账)
图例:
那么我们为了方便实现,我们定义两个指针,一个指向队尾( rear )一个指向队头(front)
图例 实现: 这里的出队front向后移动,而不是不动,所以会浪费空间,不过系统再实现队列的时候
public class newQueue<E> { E[] elements; //队列存放数据的容器 int front; //队头 int rear; //队尾 newQueue(){ this(10); } newQueue(int capacity){ elements = (E[])(new Object[capacity]); } //入队 底层用LinkedList实现,push为入队 public void push(E data){ //入队首先判断队列是否为满 if(isFull()){ elements = Arrays.copyOf(elements,elements.length*2); //二倍扩容 } elements[rear++] = data; //在队尾添加元素 } //出队 public E pop(){ //先判空 if(isEmpty()){ return null; } return elements[front++]; //从队头出 } public boolean isFull(){ return rear - front == elements.length-1; } public boolean isEmpty(){ return rear == front; } }链式队列与链表类似,基于节点实现。
实现:
public class LinkedQueue<E> { Node<E> front; //对头 Node<E> rear; //队尾 class Node<E>{ E element; Node<E> next; Node(E data){ this.element = data; } } //入队 public void push(E data){ Node<E> newNode = new Node<>(data); //如果没有元素则单独处理 if(front == null&&rear == null){ front = newNode; rear = newNode; } else { rear.next = newNode; //直接再队尾追加元素 rear再指向新的队尾 rear = rear.next; } } //出队 public E pop(){ // if (front == null&&rear == null){ return null; } //从对头出 Node<E> temp = front; front = front.next; return temp.element; } }由于其他方法实现非常简单,并且实现的思想与单链表非常相似,所以我没有实现,具体请看我的单链表博客https://blog.csdn.net/weixin_44916741/article/details/102653287
1.首先环形队列是基于数组实现的 2.当队尾与队头即将碰撞时,扩容 3.在步进时我们需要以 front = (front+1)% maxSize;
public class LoopQueue<E> { protected int front; protected int rear; protected E[] queueArrays; public static int defalutmaxSize = 5; private int maxsize; LoopQueue(){ this(defalutmaxSize); } LoopQueue(int capacity){ this.queueArrays = (E[])( new Object[capacity]); this.front = 0; this.rear = 0; this.maxSize = capacity; } //入队 public void push(E data){ //判满 if (isFull()) { queueArrays = Arrays.copyOf(queueArrays, queueArrays.length * 2); maxSize = queueArrays.length; } queueArrays[rear] = data; rear = (rear+1)%maxSize; } //出队 public E pop(){ //判空 if (isEmpty()){ return null; //或者抛出异常 } //从对头出 E temp = queueArrays[front]; front = (front+1)%maxSize; return temp; } //判满 public boolean isEmpty(){ return (rear+1)%maxSize == front; } //判空 public boolean isFull(){ return front == rear; }