如有错误请指正,谢谢!
这篇文章里面,只是简单的说了一下队列是个什么东西,以及使用Java中的数组实现这个简单的队列
队列
什么是队列?
队列,顾名思义.就是咱们平时排队的那种队列.
火车站排队买票.一个人买票,其他买票的人要去排队.等第一个人买完,然后轮到下一个...以此类推.
实现思路
大概就是这个样子.我们可以使用数组进行模拟这个队列
队列有头有尾,所以我们需要两个变量去标志这两个位置
- front 指向头部的前一个位置,初始位置为-1,即数组头的前一个位置
- rear 指向最后数组中最后一个元素的位置,同上,数组头的前一个位置:-1
- maxSize 普通的队列是有大小限制的.所以需要一个变量去定义这个数组的长度.
1.添加元素: 添加元素与我们的rear尾巴有关.将我们的rear向后移动一个位置,在这个位置上添加元素.(移动之前是要判断队列是否满)
2.获取元素: 获取元素与我们的front头部有关.将我们的头部+1,获取这个位置元素,返回.然后将这个位置置空即可.(当然获取的时候我们要判断队列是否为空)
3.判断队列是否满: 尾巴rear指向队列尾部的时候,这个简单队列就满了.rear = maxSize - 1
4.判断队列是否空: 尾巴和头部同时指向一个位置的时候,队列为空rear = front (这个是有bug的,先放一放)
代码实现
比较简单的实现了一个队列.用一次就废了.正确的用法应该是制作一个环形队列.但是学习讲究循序渐进,先从简单的开始,后边在说环形队列
代码风格,简单参考了一下ArrayList的代码风格
package name.dancer.array;
import java.io.Serializable;
import java.util.ArrayList;
/**
* 数组模拟队列
*
* @author dancer
* @date 2019-07-15
* @see ArrayList
* @description
**/
public class ArrayQueue<E> implements Serializable {
private static final long serialVersionUID = 6760058872239253731L;
/**
* 容器共有多少个元素
*/
private int maxSize;
/**
* 队列头
*/
private int front;
/**
* 队列尾
*/
private int rear;
/**
* 容器
*/
private Object[] elementData;
/**
* 初始化
*/
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
// 指向队列头部,但是不包含.
front = -1;
// 指向队列尾部,就是队列最后一个数据的位置.
rear = -1;
elementData = new Object[maxSize];
}
/**
* 判断队列满
* 尾部指向队列尾元素
*/
private boolean isFull() {
return rear == maxSize - 1;
}
/**
* 判断队列空
* 头指针和尾指针指向同一个位置.
*/
private boolean isEmpty() {
return rear == front;
}
/**
* 添加元素
* 判空
* 尾指针后移一个
* 添加元素
* TODO 这个位置有bug,应该使用环形队列
*/
public boolean add(E e) {
if (isFull()) {
System.out.println("队列满");
return false;
}
rear++;
elementData[rear] = e;
return true;
}
/**
* 获取元素
* 头指针加1
* 获取该位置元素
*/
public E get() {
if (isEmpty()) {
throw new RuntimeException("队列为空");
}
front++;
E temp = (E) elementData[front];
// 取出元素,该位置置空
elementData = null;
return temp;
}
/**
* 展示所有元素
*/
public void show() {
if (isEmpty()) {
System.out.println("队列空");
}
for (int i = 0; i < elementData.length; i++) {
System.out.printf("arr[%d] = %d", i, elementData[i]);
}
}
/**
* 查看头部元素
* 头指针+1指向头数据
*/
public E peek() {
if (isEmpty()) {
throw new RuntimeException("队列为空");
}
return (E) elementData[front + 1];
}
}