队列:可以用数组或链表来实现,遵循先入先出的原则。
数组模拟队列:队列的输入和输出分别从前后端来处理,需要两个变量:front和rear分别记录前后端的下标,front随输出而变化,rear随输入而变化。
1,尾指针后移:rear+1;
2,置空:front;
3,队列满:rear=MaxSize-1;
代码实现:
class ArrayQueue {
//声明私有变量,头部,尾部,最大容量,存放数据数组
private int front;
private int rear;
private int MaxSize;
private int[] Arr;
//创建队列的构造器
public ArrayQueue(int arrMaxSize) {
MaxSize = arrMaxSize;
Arr = new int[MaxSize];
front = -1;
rear = -1;
}
//判断队列是否满 rear=MaxSize-1
public boolean isFull() {
return rear == MaxSize - 1;
}
//判断是否为空rear==front
public boolean isEmpty() {
return rear == front;
}
//添加数据到队列 满则提升无法加入
public void addQueue(int n) {
if (isFull()) {
System.out.println("满");
return;
}
rear++;
Arr[rear] = n;
}
//获取队列的数据,出队列(判空,头指针后移,返回值)
public int getQueue() {
if (isEmpty()) {
System.out.println("空");
throw new RuntimeException("空");
}
front++;
return Arr[front];
}
//展示所有数据(判空,遍历)
public void showQueue() {
if (isEmpty()) {
System.out.println("空");
return;
}
for (int i = 0; i < Arr.length; i++) {
System.out.println("Arr[" + i + "]= " + Arr[i]);
}
}
//显示头数据
public int showFront() {
if (isEmpty()) {
System.out.println("空");
throw new RuntimeException("空");
}
return Arr[front + 1];
}
}
数组模拟环形队列:
1,front指向队列的第一个元素;初始值为0
2,rear指向队列最后一个元素的后一个位置,初始值为0
3,队列满时,(rear+1)%Maxsize=front
4,队列空的条件,rear==front
有效数据个数(rear+MaxSize-front)%MaxSize
代码实现:
public class CircularQueue {
private int front;
private int rear;
private int Maxsize;
private int[] arr;
//创建环形数组
public int[] createCQ(int MaxSize){
front=0;
rear=0;
Maxsize=MaxSize;
arr=new int[Maxsize];
return arr;
}
//判断环形数组满
public boolean isFull(){
return (rear+1)%Maxsize==front;
}
//判断环形数组空
public boolean isEmpty(){
return rear==front;
}
//元素出环
public int getValue() {
if (isEmpty()) {
throw new RuntimeException("环形队列为空");
}
int value=arr[front];
front=(front+1)%Maxsize;
return value;
}
//添加元素
public void addValue(int val){
if(isFull()){
throw new RuntimeException("队列满,无法添加");
}
arr[rear]=val;
rear=(rear+1)%Maxsize;
System.out.println("添加元素成功");
}
//元素展示
public void show(){
if(isEmpty()){
throw new RuntimeException("环形队列为空");
}
for (int i = front; i <front+(rear+Maxsize-front)%Maxsize; i++) {
System.out.println(arr[i%Maxsize]);
}
}
}