在学习队列的实现过程中,跟着教程自己手写了队列的实现,理解队列的先进先出原理。以及略微复杂的循环队列形成的一个闭环,略微吃力,还需努力,详细说明在注释
package com.zhouyou.queue;
// 普通队列的实现
public class ArrayQueue {
private int head; // 头
private int tail; // 尾
private int[] date; // 头
private int size; // changdu
private int n; // 数组的大小 最大的空间
public ArrayQueue(int cap){
date = new int[cap];
n = cap;//初始化
}
public void push(int m){
//判断我们这个队列是不是已经满了
if(tail == n){
// 移动 或者扩容,为了节约性能是移动 时间复杂度n-1 之前都是o(1)
return;
}
date[tail] = m;
tail++;
}
public int pop(){
//出队列 1 2 3 4 5 O(1) 很大的空间浪费 判断空
if (isEmpty()){
return -1;
}
// 先进先出 每次都是从头开始弹
int m = date[head];
head ++;
return m;
}
private boolean isEmpty(){
return head == tail;
}
public static void main(String[] args) {
ArrayQueue arrayQueue = new ArrayQueue(5);
arrayQueue.push(1);
arrayQueue.push(2);
arrayQueue.push(3);
arrayQueue.push(4);
arrayQueue.push(2);
int[] date = arrayQueue.date;
for (int i : date) {
System.out.println(i);
int pop = arrayQueue.pop();
System.out.println("弹出来的是: "+ pop);
}
}
}
下面是循环队列的实现
package com.zhouyou.queue;
public class CircleArrayQueue {
private int data[]; // 数据
private int head = 0; //头
private int tail = 0; //尾
private int n = 0; //数组的大小 最大的空间
private int size; //当前已经存了几个数了
public CircleArrayQueue(int cap){
data = new int[cap];
n = cap;
}
public void push(int m){
// 判断 队列 是否 满了 用取模 是防止 0 1 等情况
if((tail + 1) % n == head){
return ;
}
data[tail] = m;
// 循环队列 tail=7 8越界了,(7+1)%8==0
tail = (tail + 1) % n;
}
public int pop(){
if(isEmpty()){
return -1;
}
int m = data[head];
head = (head + 1) % n;
return m;
}
public boolean isEmpty(){
return head == tail;
}
public static void main(String[] args) {
CircleArrayQueue arrayQueue = new CircleArrayQueue(6);
arrayQueue.push(1);
arrayQueue.push(2);
arrayQueue.push(3);
arrayQueue.push(4);
arrayQueue.push(5);
int[] date = arrayQueue.data;
System.out.println(date.length);
for (int i : date) {
System.out.println(i);
int pop = arrayQueue.pop();
System.out.println("弹出来的是: "+ pop);
}
}
}
记录学习历程