1.背景
![]()
2.代码
package com.ldp.structure.demo01;
import java.util.Scanner;
/**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 04/09 11:08
* @description <p>
* 环形数组实现队列
* </p>
*/
public class Test02 {
public static void main(String[] args) {
// size=4,实际最多放入3个
QueueArray queue = new QueueArray(4);
Scanner scanner = new Scanner(System.in);
String key = "";
boolean flag = true;
while (flag) {
System.out.println("(s)show查看队列");
System.out.println("(a)add添加一个元素");
System.out.println("(g)get获取一个元素");
System.out.println("(l)look查看下一个元素");
System.out.println("(e)exit退出系统");
key = scanner.next();
switch (key) {
case "s":
queue.show();
break;
case "a":
System.out.println("请输入一个数字:");
try {
queue.add(Integer.valueOf(scanner.next()));
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case "g":
try {
System.out.println(queue.get());
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case "l":
try {
System.out.println(queue.look());
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case "e":
System.out.println("退出系统");
flag = false;
break;
default:
System.out.println("输入错误");
}
}
}
}
/**
* 为空的判断条件:front==rear
* 已满的判断条件:(rear+1)%maxSize==front
* 当前有效个数的计算方式: (rear-front+maxSize)%maxSize
*/
class QueueArray {
private int maxSize;// 最大方如个数,实际上最大只能放入maxSize-1
private int front;// 将要取的下标
private int rear; // 将要放入的下标
private Integer[] dataArray;
public QueueArray(int size) {
this.dataArray = new Integer[size];
this.maxSize = size;
this.front = 0;
this.rear = 0;
}
/**
* 检查队列是否为空
* 条件: front=rear
*/
public boolean isEmpty() {
if (front == rear) {
return true;
} else {
return false;
}
}
/**
* 检查队列是否已满
* 已满条件
* (rear+1)%maxSize==front
*
* @return
*/
public boolean isFull() {
if ((rear + 1) % maxSize == front) {
return true;
} else {
return false;
}
}
/**
* 检查队列中有效个数
*
* @return
*/
public int haveNum() {
return (rear - front + maxSize) % maxSize;
}
/**
* 添加一个元素
*
* @param n
*/
public void add(int n) {
if (isFull()) {
throw new RuntimeException("队列已满");
} else {
dataArray[rear] = n;
// 支持循环存放,当前数组的下标
rear = (rear + 1) % maxSize;
}
}
/**
* 获取队列中的一个数据
*
* @return
*/
public int get() {
if (isEmpty()) {
throw new RuntimeException("队列为空");
} else {
int n = dataArray[front];
dataArray[front] = null;
// 支持循环取出,当前数组的下标
front = (front + 1) % maxSize;
return n;
}
}
/**
* 即将出队列的值
*
* @return
*/
public int look() {
if (isEmpty()) {
throw new RuntimeException("队列为空");
} else {
return dataArray[front];
}
}
/**
* 打印数组
*/
public void show() {
System.out.print("[");
for (int i = 0; i < dataArray.length; i++) {
System.out.print(dataArray[i] + "\t");
}
System.out.print("]");
System.out.println();
}
}
完美