「java使用链表实现队列」编写实现队列的例程,使用链表

博主:adminadmin 2022-12-04 04:42:07 80

本篇文章给大家谈谈java使用链表实现队列,以及编写实现队列的例程,使用链表对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

队列的 2 种实现方式

队列,是一个线性表,和数组,栈,链表类似。队列和栈类似,戏称“边吃边拉”。即 FIFO。

队列和栈还有一个不同,栈只需维护一个栈顶指针,而队列需要维护 2 个指针,队首和队尾。

队列可以使用数组实现,例如 Java 类库的 LinkedBlockingQueue,也可以使用数组实现,例如 Java 的 ArrayBlockingQueue。这里我们讨论数组的实现。

通常使用数组实现,会使用循环数组,也称 ringBuffer,好处是不用 copy 数组进行迁移,另外,传统实现,如果数组满了,就不能再继续插入了,即使前面还有空间,因此就需要刚刚说的 copy 进行迁移。下面是最简单的一个 Java 循环数组实现。

这个是一个标准的实现,但是存在一个问题:如果队列长度是 8,那么就只能存储 7 个元素。原因下面分析。

这个图,表示队列为空,因为 put 指针和 get 指针,指向了同一个槽位。get 指针不能够再继续移动。

那如果表示满了呢?

这个图,get 指针在 5 槽位,put 指针 4 槽位,put 指针不能再继续移动,否则会覆盖 5 槽位的值。

由此我们得到公式:

isEmpty = put == get;

ifFull = (put + 1) % n == get;

所以,put 一定比 get 少在一个槽位。

当 put 在 7 这个槽位,get 在 0 这个槽位,他还能继续放入元素在 7 这个位置吗?答案是不能,因为我们通过 put + 1 % n == get 这个公式计算,如果 在 7 个槽位加入了元素,那么 put 指针就会变成 0,问题来了,put 是 0 ,get 也是0。

而 isEmpty 的公式是 put == get。这个时候,就会发生判断错误:原本是满的,却判断是空的。

所以,这个实现导致必须有一个空位。当然,我们也可以把槽位加1,也就是把数组长度加 1,避免实际长度不符合预期,也可以避免这个问题。

通过上面的分析,我们知道了,如果不加上1,将导致 isEmpty 判断错误。原因是如果 put 和 get 指针重合,我们无法区分到底是 满了 还是 空了。因为我们判断是满还是空,利用的是指针。

如果不使用指针呢?使用一个计算器,例如,添加一个元素,计算器 + 1, 删除一个元素,计算器 - 1. 是否可以呢?答案是可以的.

下面是具体实现:

我们判断 ifEmpty ,使用 size == 0 判断;判断 isFull,使用 size == n 判断,这样就解决了这个问题。

队列可以使用链表和数组实现,通常使用使用数组实现,效率高,不用搬移。使用循环数组,需要考虑的是 ifFull 判断和 isEmpty 判断。

这里我建议使用 size 这种方式,而不是 + 1 这种方式,为什么呢?使用 size 这种方式,我们可以利用 运算来快速计算下标——只要用户指定的队列长度是 2 的幂次方。

如果使用 + 1 的方式,即使用户指定的队列长度是 2 的幂次方,也无法使用 运算快速获取下标。

当然,我们也可以根据用户指定的队列长度是否为2 的幂次方,来觉得到底是使用 size 方式,还是使用 + 1 方式。

JAVA里链队怎么移动指针

循环条件或者判断语句。

为了和队列的定义保持一致,所以要指明尾指针,链式队列只是队列的一种实现方式,还要把握住队列的本质,至于尾指针指向是尾结点还是尾结点的下一个结点,这个只是实现的一点区别,没有强制的要求。要根据自己的具体实现选择,不同的应用这两种会有些微小的区别,比如循环条件,判空等。

判断依据是根据栈和堆解决,栈是后进先出,用链表的话在头部操作即可,没必要再加个尾指针,队列是先进先出,头尾都要有指针记忆位置,但是循环链表的话,尾节点的下一个便是头结点,所以只要有个尾指针即可,头指针省略不用。

java中的队列用什么实现

其内部是用链表实现的。

class ABT//一个链表类

{

class NodeT//内部类,表示链表中的一个节点

{

NodeT prev;//前一节点

NodeT next; //后一节点

T abc; //当前节点的元素

}

}

大体如上,具体的功能自行添加。

Java使用LinkedList来模拟一个队列(先进先出的特性)

import java.util.LinkedList;

public class Demo01 {

private LinkedListObject linkedList;

public Demo01() {

linkedList = new LinkedListObject();

}

public void put(Object object) {

linkedList.add(object);

}

public Object get() {

Object object = null;

if (linkedList.size() != 0) {

object = linkedList.get(0);

linkedList.remove(0);

}

return object;

}

public boolean isEmpty() {

if (linkedList.size() != 0) {

return true;

} else {

return false;

}

}

public static void main(String[] args) {

Demo01 demo01 = new Demo01();

demo01.put("1");

demo01.put("2");

System.out.println(demo01.get());

System.out.println(demo01.get());

System.out.println(demo01.isEmpty());

}

}

结果:

1

2

false

关于java使用链表实现队列和编写实现队列的例程,使用链表的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-04,除非注明,否则均为首码项目网原创文章,转载请注明出处。