基于双链表 实现Java Queue队列

除了可以通过一维数组,单链表实现queue队列,还可以通过双链表实现queue队列。

在基于NLNode类实现双向链表的时候,为了使编程更加简洁,通常我们都要在最前端和最后端各设置一个哑元节点( Dummy node )。这两个节点分别称作头节点( Header node )和尾节点( Trailer node) ㈠,起哨兵( Sentinel)的作用。也就是说,它们并不存储任何实质的数据对象,头(尾)节点的next( prev)引用指向首(末)节点,而prev(next)引用为空。如此构成的双向链表结构,如下代码示:

Java代码:

DoubleNode 类:

package com.doub.list;

/**
 *
 * @author gannyee
 *
 */
public class DoubleNode {

    //Declared element
    private Object element;
    //Declared prior
    private DoubleNode prior;
    //Declared next
    private DoubleNode next;

    //Constructor
    public DoubleNode(){
        this(null,null,null);
    }

    public DoubleNode(DoubleNode prior,Object element, DoubleNode next){
        this.prior = prior;
        this.element = element;
        this.next = next;
    }
    //Get element
    public Object getElement() {
        return element;
    }

    //Set element
    public void setElement(Object element) {
        this.element = element;
    }

    //Get prior
    public DoubleNode getPrior() {
        return prior;
    }

    //Set prior
    public void setPrior(DoubleNode prior) {
        this.prior = prior;
    }

    //Get next
    public DoubleNode getNext() {
        return next;
    }

    //Set next
    public void setNext(DoubleNode next) {
        this.next = next;
    }

}

DoubleListQueue 类:

package com.doub.list;

import java.util.Arrays;

import com.queue.ExceptionQueueEmpty;

public class DoubleListQueue {

    // Declared head
    private static DoubleNode head;
    // Declared rear
    private static DoubleNode rear;
    // Declared size;
    private static int size;
    //Declared length
    private static int length;
    // Constructor
    public DoubleListQueue() {
        //initialize
        head = new DoubleNode();
        rear = new DoubleNode();

        head.setNext(rear);
        head.setPrior(null);
        rear.setNext(null);
        rear.setPrior(head);
        this.size = this.length = 0;
    }

    // Get size
    public int getSize() {
        return size;
    }

    //Get length
    public int length(){
        return length;
    }

    // Is empty
    public boolean isEmpty() {
        return size == 0;
    }

    // Insert element in first position
    public void insertFirst(Object element) {
        DoubleNode newNode = new DoubleNode(head,element,head.getNext());
        head.getNext().setPrior(newNode);
        head.setNext(newNode);
        size ++;
        length = size;
    }

    // Insert element in last position
    public void insertLast(Object element) {
        DoubleNode newNode = new DoubleNode(rear.getPrior(),element,rear);
        rear.getPrior().setNext(newNode);
        rear.setPrior(newNode);
        size ++;
        length = size;
    }

    // Remove element from first position
    public void removeFirst() throws ExceptionQueueEmpty{
        if(isEmpty())
            throw new ExceptionQueueEmpty("Queue is empty");
        head.getNext().getNext().setPrior(head);
        head.setNext(head.getNext().getNext());
        size --;
    }

    // Remove element from last position
    public void removeLast() throws ExceptionQueueEmpty{
        if(isEmpty())
            throw new ExceptionQueueEmpty("Queue is empty");
        rear.getPrior().getPrior().setNext(rear);
        rear.setPrior(rear.getPrior().getPrior());
        size --;
    }

    // Get first node but not isn‘t deletion
    public Object getFirst() throws ExceptionQueueEmpty{
        if(isEmpty())
            throw new ExceptionQueueEmpty("Queue is empty");
        return head.getNext().getElement();
    }

    // Get last node but not isn‘t deletion
    public Object getLast() throws ExceptionQueueEmpty{
        if(isEmpty())
            throw new ExceptionQueueEmpty("Queue is empty");
        return rear.getPrior().getElement();
    }

    //Get all element
    public void getAllElements(){
        Object[] array = new Object[getSize()];

        DoubleNode travelNode = new DoubleNode();
        travelNode = head.getNext();
        for(int i = 0; travelNode != rear;i ++){
            array[i] = travelNode.getElement();
            travelNode = travelNode.getNext();
        }
        System.out.println("All elements are: " + Arrays.toString(array));
    }
}

DoubleListQueueTest 类:

package com.doub.list;

import com.queue.ExceptionQueueEmpty;

/**
 *
 * @author gannyee
 *
 */
public class DoubleListQueueTest {

    public static void main(String[] args) throws ExceptionQueueEmpty {
        DoubleListQueue dlq = new DoubleListQueue();

        System.out.println("Size: " + dlq.getSize());
        System.out.println("Is empty? " + dlq.isEmpty());

        for(int i = 0;i < 6;i ++){
            dlq.insertFirst(i);
        }

        System.out.println("Size: " + dlq.getSize());
        System.out.println("Is empty? " + dlq.isEmpty());
        dlq.getAllElements();
        System.out.println(dlq.getFirst());
        System.out.println(dlq.getLast());

        for(int i = 0;i < 6;i ++){
            dlq.insertLast(i + 1);
        }

        System.out.println("Size: " + dlq.getSize());
        System.out.println("Is empty? " + dlq.isEmpty());
        dlq.getAllElements();
        System.out.println(dlq.getFirst());
        System.out.println(dlq.getLast());

        for(int i = 0;i < 6;i ++){
            dlq.removeFirst();
        }

        System.out.println("Size: " + dlq.getSize());
        System.out.println("Is empty? " + dlq.isEmpty());
        dlq.getAllElements();
        System.out.println(dlq.getFirst());
        System.out.println(dlq.getLast());

        for(int i = 0;i < 6;i ++){
            dlq.removeLast();
        }

        System.out.println("Size: " + dlq.getSize());
        System.out.println("Is empty? " + dlq.isEmpty());
        dlq.getAllElements();
    }

}

测试结果:

Size: 0
Is empty? true
Size: 6
Is empty? false
All elements are: [5, 4, 3, 2, 1, 0]
5
0
Size: 12
Is empty? false
All elements are: [5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6]
5
6
Size: 6
Is empty? false
All elements are: [1, 2, 3, 4, 5, 6]
1
6
Size: 0
Is empty? true
All elements are: []

参考文献:数据结构与算法( Java 描述)邓俊辉 著

时间: 2024-12-30 00:08:10

基于双链表 实现Java Queue队列的相关文章

atitit. java queue 队列体系and自定义基于数据库的队列总结o7t

atitit. java queue 队列体系and自定义基于数据库的队列总结o7t 1. 阻塞队列和非阻塞队列 1 2. java.util.Queue接口, 1 3. ConcurrentLinkedQueue 2 4. BlockingQueue阻塞队列 2 4.1. 1. ArrayBlockingQueue 3 4.2. 2. LinkedBlockingQueue 3 4.3. 3. DelayQueue 3 4.4. 4. PriorityBlockingQueue 3 4.5. 

atitit. java queue 队列体系and自己定义基于数据库的队列总结o7t

atitit. java queue 队列体系and自己定义基于数据库的队列总结o7t 1. 堵塞队列和非堵塞队列 1 2. java.util.Queue接口. 1 3. ConcurrentLinkedQueue 2 4. BlockingQueue堵塞队列 2 4.1. 1. ArrayBlockingQueue 3 4.2. 2. LinkedBlockingQueue 3 4.3. 3. DelayQueue 3 4.4. 4. PriorityBlockingQueue 3 4.5.

[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列

python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构时,这些高级的数据结构可能给我们以迷惑. 比如,使用list实现queue的时候,入队操作append()时间复杂度可以认为是O(1),但是,出队操作pop(0)的时间复杂度就是O(n). 如果是想利用python学学数据结构的话,我觉得还是自己实现一遍基本的数据结构为好. 1.链表 在这里,我想使

解读 Java 并发队列 BlockingQueue

最近得空,想写篇文章好好说说 java 线程池问题,我相信很多人都一知半解的,包括我自己在仔仔细细看源码之前,也有许多的不解,甚至有些地方我一直都没有理解到位. 说到线程池实现,那么就不得不涉及到各种 BlockingQueue 的实现,那么我想就 BlockingQueue 的问题和大家分享分享我了解的一些知识. 本文没有像之前分析 AQS 那样一行一行源码分析了,不过还是把其中最重要和最难理解的代码说了一遍,所以不免篇幅略长.本文涉及到比较多的 Doug Lea 对 BlockingQueu

日常学习随笔-数组、单链表、双链表三种形式实现栈结构的基本操作

一.栈结构 栈(stack)是限制插入和删除只能在一个位置上的表,该位置是 表的末端,叫做栈的顶(Top).对栈的基本操作有push(进栈),pop(出栈),peak(栈顶元素),size(栈容量)等. 栈的核心思想:"先进后出". 二.案例一:数组实现"栈" 1 package com.xfwl.algorithmAnalysis.stack; 2 3 import java.util.Arrays; 4 5 /** 6 * 自定义栈结构(基于数组的形式) 7 *

深度解析(三)数组、单链表和双链表

数组.单链表和双链表介绍 以及 双向链表的C/C++/Java实现 概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现.内容包括:数组单向链表双向链表1. C实现双链表2. C++实现双链表3. Java实现双链表 数组 数组有上界和下界,数组的元素在上下界内是连续的. 存储10,20,30,40,50的数组的示意图如下: 数组的特点是:数据是连续的

基于链表实现Java 自定义Queue队列

与栈一样,我们也可以借助单链表来实现队列ADT.同样地,出于效率方面的考虑,我们将以单链表的首(末)节点作为队列的首(末)节点??这样,可以回避单链表在尾部进行删除操作时效率低下的缺陷.此外,还需要两个实例变量分别指示表的首.末节点. java代码如下: QueueList: package com.list.queue; import java.util.Arrays; import com.list.stack.Node; import com.list.stack.ExceptionSta

基于数组实现Java 自定义Queue队列及应用

Java 自定义队列Queue: 队列的抽象数据类型就是一个容器,其中的对象排成一个序列,我们只能访问和取出排在最前端( Front)的对象,只能在队列的尾部( Rear)插入新对象.正是按照这一规则,才能保证最先被插入的对象首先被删除( FIFO).java本身是有自带Queue类包,为了达到学习目的已经更好深入了解Queue队列,自己动手自建java Queue类是个很好的学习开始: 基于数组的实现 ? 顺序数组 借助一个定长数组 Q 来存放对象,即可简单地实现队列.那么,为了符合 FIFO

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有