1. 队列
1.1 基本介绍
队列是一个先进先出,操作受限的有序列表,只允许在队头取出数据,队尾存入数据
1.2 数组模拟队列
1.2.1 思路分析
1.2.2 代码实现
package com.cy.queue;
/** 使用数组模拟队列 */
public class ArrayQueueDemo {
public static void main(String[] args) {
// 初始化一个队列,容量为6
ArrayQueue queue = new ArrayQueue(6);
// 存入6个数据,再取出3个数据
for (int i = 0; i < 6; i++) {
queue.addData(i);
}
queue.showData();
for (int i = 0; i < 3; i++) {
queue.getData();
}
queue.showData();
// 展示队列有效数据个数
System.out.println("有效数据个数: " + queue.size());
System.out.println("------------------------------------");
// 再次添加3个,继续添加显示队列已满
for (int i = 0; i < 3; i++) {
queue.addData(i);
}
queue.showData();
queue.addData(0);
System.out.println("------------------------------------");
// 取出全部数据,继续取出显示队列为空,抛出异常
for (int i = 0; i < 6; i++) {
queue.getData();
}
queue.showData();
queue.getData();
}
}
/** 队列 */
class ArrayQueue {
private int[] array; // 数组
private int maxSize; // 队列容量
private int dataSize; // 有效数据个数
private int front; // 对头,指向队列第一个元素
private int rear; // 队尾,指向队列最后一个元素的后一位
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
array = new int[this.maxSize];
}
// 判断队列是否为空
public boolean isEmpty() {
return dataSize == 0;
}
// 判断队列是否已满
public boolean isFull() {
return dataSize == maxSize;
}
// 添加数据到队列
public boolean addData(int data) {
if (isFull()) {
System.out.println("添加失败,队列已满!");
return false;
}
array[rear] = data;
rear = (rear + 1) % maxSize;
dataSize++;
return true;
}
// 取出队列的数据
public int getData() {
if (isEmpty()) {
throw new RuntimeException("取出失败,队列为空!");
}
int data = array[front];
front = (front + 1) % maxSize;
dataSize--;
return data;
}
// 判断队列中有效数据个数
public int size() {
return dataSize;
}
// 显式队列中的所有有效数据
public void showData() {
if (isEmpty()) {
System.out.println("显示失败,队列为空!");
return;
}
for (int i = front; i < front + size(); i++) {
System.out.printf("array[%d]=%d\t", i % maxSize, array[i % maxSize]);
}
System.out.println();
}
}
运行效果如下: