Java数据结构与算法_队列
一、队列介绍
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
二、单向队列的实现
/**
* @Author: slx
* @Date: 2019/5/10 15:44
*/
public class ShuQueue {
private Object[] queueArray;
//队列总大小
private int maxSize;
//对头
private int front;
//队尾
private int rear;
//队列中元素的实际数目
private int nItems;
public ShuQueue(int s) {
this.maxSize = s;
queueArray = new Object[maxSize];
front = 0;
rear = -1;
nItems = 0;
}
//队列中新增数据
public void insert(int value) {
if (isFull()) {
System.out.println("队列已满!");
}else {
//如果队列尾部指向顶了,那么循环回来,执行队列的第一个元素
if (rear == maxSize -1) {
rear = -1;
}
//队尾指针加1,然后在队尾指针插入新的数据
queueArray[++rear] = value;
nItems++;
}
}
//移除数据
public Object remove() {
Object removeValue = null;
if (!isEmpty()) {
removeValue = queueArray[front];
queueArray[front] = null;
front++;
if (front == maxSize) {
front = 0;
}
nItems--;
return removeValue;
}
return removeValue;
}
//查看对头元素
public Object peekFront() {
return queueArray[front];
}
//判断队列是否满了
public boolean isFull() {
return (nItems == maxSize);
}
//判断队列是否为空
public boolean isEmpty() {
return (nItems == 0);
}
//返回队列的大小
public int getSize() {
return nItems;
}
}
测试代码:
/**
* @Author: slx
* @Date: 2019/5/12 20:32
*/
public class ShuQueueTest {
public static void main(String[] args) {
ShuQueue queue = new ShuQueue(5);
queue.insert(1);
queue.insert(2);
queue.insert(3);
queue.insert(4);
queue.insert(5);
System.out.println(queue.peekFront());
queue.remove();
System.out.println(queue.peekFront());
queue.insert(6);
queue.insert(7);
}
}
结果
1
2
队列已满!
Process finished with exit code 0
三、优先级队列(基于数组实现)
/**
* @Author: slx
* @Date: 2019/5/12 20:42
*/
public class ShuPriorityQueue {
private int maxSize;
private int[] priQueueArray;
private int nItems;
public ShuPriorityQueue(int s) {
this.maxSize = s;
priQueueArray = new int[maxSize];
nItems = 0;
}
//插入数据
public void insert(int value) {
int j;
if (nItems == 0) {
priQueueArray[nItems++] = value;
}else {
j = nItems - 1;
//选择的排序方法是插入排序,按照从大到小的顺序排列,越小的越在队列尾部
while (j >= 0 && value > priQueueArray[j]) {
priQueueArray[j+1] = priQueueArray[j];
j--;
}
priQueueArray[j+1] = value;
nItems++;
}
}
//移除数据,由于是按照从大到小的顺序排列的,所以我们移除数据我们指针向下移动
//被移除的地方由于是int类型的,不能设置为null,这里的做法是设置为 -1
public int remove() {
int k = nItems - 1;
int value = priQueueArray[k];
priQueueArray[k] = -1;//-1表示这个位置的数据被移除了
nItems--;
return value;
}
//查看优先级最高的元素
public int peekMin() {
return priQueueArray[nItems-1];
}
//判断是否为空
public boolean isEmpty() {
return (nItems == 0);
}
//判断队列是否满了
public boolean isFull() {
return (nItems == maxSize);
}
}