Java手写队列,最近在学习Aqs,发现里面涉及到很多队列的写法,非常难以理解,于是,专门去学习了队列的Java写法。但是,网上的文章很多只列出一段段代码,其他的需要你自己去理解。
考虑到一些小伙伴们,可能无法理解其中的意思。所以,我写了一篇细到头发丝的队列文章,每一行都有解释,如果我这样教,你还看不懂,我真的没有办法了。
队列,先进先出。能理解吗,你就想象一个管道,你从管道进去,后面的人在你后面,前面的人在你前面,废话,我当然知道。队列也是如此,你出来时,前面的人已经出来了,后面的人准备出来。所以,队列有一定的延时。
下面,开始贴代码
/**
* @author: Jessica
* @date: 2022-01-19 15:21
* @desc: 手写队列,可以用链表实现,也可以用数组实现,这里用链表实现
**/
public class HandWriteQuene {
//head--->在offer方法添加的时候,这个属性会指向一个new出来的内部类,ListNode对象
//tail也是如此
private ListNode head;
private ListNode tail;
private static class ListNode{
//一个链表里面,需要有3个元素,一个元素表示当前的值,还有一个元素表示前一个节点的全部信息
//最后一个节点表示后一个节点的全部信息
private final int value;
private ListNode pre;
private ListNode next;
//将值传入当前节点里面,这里可以先埋一个伏笔
//我们在添加的时候,第一次添加,如果你是设计师,怎么添加?
//第二次添加呢?最后一次添加呢?
public ListNode(int value,ListNode pre,ListNode next){
this.value=value;
this.pre=pre;
this.next=next;
}
}
public void offer(int val){
//head为空,表示没有数据,那么这个时候,添加一个节点,它既是头节点,也是尾节点
//第一个节点没有头节点,因为它自己就是头,也没有尾节点
if (head ==null){
head=tail=new ListNode(val,null,null);
}else {
//第二次添加走到这里,第一个元素加入值,第二个元素加入上一个节点的全部信息,第三个元素依然为null
tail.next=new ListNode(val,tail,null);
tail=tail.next;
//不能这样写,这样写的话,等于把tail全部替换了,之前的tail是 1,null,null
//现在是2,{1,null,null},null
//我们期待的是2,{1,null,{2,{1,null,null}}},也就是说,希望第二个节点的pre保存的信息是
//第一个节点的完整信息 1,null,{2,{1,null,null}}
//tail=new ListNode(val,tail,null);
}
}
public int take(){
if (tail ==null){
throw new RuntimeException("没有节点可以取出");
}else {
//需要备份一份给到pop,因为在返回之前,需要把head的pre置为空
//因为删了一次之后,2的pre为1,需要把2的pre置为空
ListNode pop=head;
head=head.next;
if (head==null){
tail=head;
}else {
head.pre=null;
}
return pop.value;
}
}
@Override
public String toString(){
StringBuffer stringBuffer = new StringBuffer();
ListNode cur=head;
while (cur !=null){ //while(true) 循环取出
stringBuffer.append(cur.value).append("=>");
cur=cur.next;
}
stringBuffer.append("null");
return stringBuffer.toString();
}
public static void main(String[] args) {
HandWriteQuene handWriteQuene = new HandWriteQuene();
handWriteQuene.offer(1);
handWriteQuene.offer(2);
handWriteQuene.offer(3);
System.out.println("toString: " + handWriteQuene);
System.out.println("take: " + handWriteQuene.take());
System.out.println("toString: " + handWriteQuene);
System.out.println("take: " + handWriteQuene.take());
System.out.println("toString: " + handWriteQuene);
System.out.println("take: " + handWriteQuene.take());
System.out.println("toString: " + handWriteQuene);
System.out.println("take: " + handWriteQuene.take());
System.out.println("toString: " + handWriteQuene);
}
}