队列:一个有序列表,实现方式有两种—循环数组/链表
特点:先进先出(FIFO)
实现方式:循环数组
首先明确两个基本约定:
- 数组为空/满的判断:rear % maxsize == front(数组满);rear == front(数组空)
- 数组有效数据的个数:rear - front
说明:
- rear指向数组最后一个元素下一位,即当第一个数字填入数组时,front=0&rear=1;当第8个数字填入数组的时候,front=7&rear=8;
- 数组中的下标统一用,“尾:【rear%maxsize】”和“头:【front%maxsize】”表示
示例代码:
public class MyQueue{
//定义Queue内部属性
private int[] interArray;
private int Maxsize;
private int front;
private int rear;
//创建队列的构造器
public MyQueue(int maxsize){
interArray = new int[maxsize];
Maxsize = maxsize;
front = 0;
rear = 0;
}
//队列的几个常用方法
//判断为空
public boolean isEmpty(){
return front == rear;
}
//判断为满
public boolean isFull(){
return (rear % Maxsize) == front;
}
//返回有效数据的个数
public int getNum(){
return rear - front;
}
//往队列存入一个数字
public void add(int addNum){
if (isEmpty()){
interArray[rear%Maxsize] = addNum;
rear++;
}else {
if (isFull()){
throw new RuntimeException("队列已满,不能加入数据");
}else {
interArray[rear%Maxsize] = addNum;
rear++;
}
}
}
//取出一个数字
public int get(){
if (isEmpty()){
throw new RuntimeException("队列为空,无有效数据");
}else {
int getid = front%Maxsize;
front++;
return interArray[getid];
}
}
//打印所有的数据
public void getAll(){
if (isEmpty()){
throw new RuntimeException("队列为空,无有效数据");
}else {
for (int i = front; i < rear; i++){
System.out.println(interArray[i%Maxsize]);
}
}
}
}
public class QueueDemo {
public static void main(String[] args) {
MyQueue myQueue = new MyQueue(3);
myQueue.add(4);
myQueue.add(18);
myQueue.add(92);
// System.out.println(myQueue.get()+"===========");
myQueue.add(12);
myQueue.getAll();
// myQueue.add(123);
// System.out.println(myQueue.get());
}
}