队列之-链式实现

作者: 愤怒的谜团 | 来源:发表于2019-11-30 20:26 被阅读0次

一、队列的链式实现概述

队列本身就是一种特殊的线性表,所以跟线性表一样,可以使用顺序存储和链式存储两种方式,顺序存储已经在队列之-循环队列中讲述了,本文就补充一下链式的实现方式。

链式队列:增删的时间复杂度都是O(1),并且基本可以说是无大小限制,但是就是需要额外的存储空间来存储每个结点的指针。

链式队列.png

默认将front(队头指针)指向头结点,头结点本身不存储值,只是为了方便删除第一个结点时的通用操作。rear指针指向链式队列的最后一个结点,这样就方便在队尾添加结点。初始状态(即空的链式队列),front和rear都指向头结点。

二、队列的链式实现-java

public class MyLinkedQueue<E> {
    /**
     * 使用链式存储实现队列
     */

    /**
     * 链式队列常用的方法如下:
     * 1、InitLinkedQueue()    初始化一个链式队列
     * 2、ClearLinkedQueue()   清空一个链式队列
     * 3、LinkedQueueEmpty()    判断链式队列是否为空
     * 4、GetHead()  获取链式队列尾部结点数据
     * 5、EnLinkedQueue()  在链式队列尾部插入新结点
     * 6、DeLinkedQueue()  删除链式队列头部结点
     * 7、LinkedQueueLength()  返回链式队列的长度
     */
    //定义结点
    class QueueNode{
        E elem;
        QueueNode next;
    }
    int maxLinkedQueueSize; //当前链式队列的大小
    QueueNode front;
    QueueNode rear;
    public MyLinkedQueue(){
        //初始化一个头结点
        this.front = new QueueNode();
        front.elem = (E)null;
        front.next = null;
        this.rear = front;
        this.maxLinkedQueueSize = 0;
    }
    public void ClearLinkedQueue(){
        if (this.maxLinkedQueueSize == 0){return;}
        while(this.maxLinkedQueueSize != 0){
            DeLinkedQueue();
        }
    }

    public Boolean LinkedQueueEmpty(){
        return this.maxLinkedQueueSize == 0 ? true : false;
    }

    public E GetHead(){
        if (this.maxLinkedQueueSize == 0){return null;}
        return front.next.elem;
    }

    public void EnLinkedQueue(E elem){
        QueueNode insertNode = new QueueNode();
        insertNode.elem = elem;
        insertNode.next = null;
        rear.next = insertNode;
        rear = rear.next;
        this.maxLinkedQueueSize++;
    }

    public E DeLinkedQueue(){
        if (this.maxLinkedQueueSize == 0){
            //说明是空的链式队列
            return null;
        }
        if (front.next == rear){
            //说明只有一个结点
            E returnElem = front.next.elem;
            rear = front;
            this.maxLinkedQueueSize = 0;
            return returnElem;
        }
        E returnElem = front.next.elem;
        QueueNode temp = front.next;
        front.next = front.next.next;
        temp.next = null;
        this.maxLinkedQueueSize--;
        return returnElem;
    }

    public int LinkedQueueLength(){
        return this.maxLinkedQueueSize;
    }

    public String toString(){
        if (front == rear){
            return null;
        }
        StringBuffer stringBuffer = new StringBuffer();
        QueueNode currNode = null;
        for (currNode = front.next;currNode != rear;currNode = currNode.next){
            stringBuffer.append(currNode.elem);
            stringBuffer.append(",");
        }
        stringBuffer.append(currNode.elem);
        return stringBuffer.toString();
    }
    
    public static void main(String[] args) {
    }
}

相关文章

  • 37_队列的概念及实现(下)

    关键词:队列的链式存储实现、链式队列的设计要点、队列链式存储实现的优化、LinkQueue.h 0. 队列的链式存...

  • 链式队列的定义,ios基础知识篇!

    数据结构与算法-链式队列 链式队列的定义 链式队列是用链表来实现的队列,不存在队满的情况。链式队列也包里队列的特点...

  • C语言实现链式队列

    链式队列,简称"链队列",即使用链表实现的队列存储结构。链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为...

  • 队列之-链式实现

    一、队列的链式实现概述 队列本身就是一种特殊的线性表,所以跟线性表一样,可以使用顺序存储和链式存储两种方式,顺序存...

  • C语言第七次作业:链表

    707. 设计链表 空指针 空节点 225. 用队列实现栈 链式存储栈 双队列实现栈 232. 用栈实现队列 链式...

  • 数据结构 第6节 队列

    一、什么叫做队列❓ 一种可以实现【先进先出】的存储结构 二、队列的分类 链式队列链式队列示意图:链表形式实现,fr...

  • 数据结构之队列的链式存储结构

    之前写了队列的顺序存储结构,队列的定义及操作见 数据结构之队列的顺序存储结构 队列的链式存储结构与操作实现 队列接...

  • 有关“队列”的总结

    队列 定义 分类 链式队列 (用链表实现) 静态队列 (用数组实现)图静态队列通常都必须是循环队列循环队列的讲解:...

  • Java数组实现循环队列

    Java数组实现循环队列 上一节(Java实现队列——顺序队列、链式队列)我们使用数组实现了顺序队列,但是在tai...

  • Java实现队列——顺序队列、链式队列

    Java实现队列——顺序队列、链式队列 概念 先进者先出,这就是典型的“队列”。(First In, First ...

网友评论

    本文标题:队列之-链式实现

    本文链接:https://www.haomeiwen.com/subject/yncawctx.html