Java数据结构专题解析之栈和队列的实现

Java数据结构专题解析之栈和队列的实现

什么是栈和队列?

在计算机科学中,(Stack)和队列(Queue)都是常见的数据结构,用于解决许多问题。它们都是线性数据结构,但它们的元素访问顺序不同。

  • 栈是先进后出(Last In First Out,LIFO)的结构,即最后放入栈中的元素最先被访问。
  • 队列是先进先出(First In First Out,FIFO)的结构,即最早放入队列中的元素最先被访问。

举个例子,我们生活中很常见的一个栈就是桶,不断往桶里踩东西,但是只有当最上面的东西被取走之后,第二层才能被取走,以此类推;而队列则类似排队,先来的先被服务,后来的等待在队列中。

栈的实现

栈的常见实现方式是使用数组或链表,这里我们采用链表来实现。一个栈包含两个主要操作:压入(push)和弹出(pop)。在链表实现中,我们需要每次将新元素插入链表的头部,同时我们也需要记录当前栈顶元素的位置,以便在弹出元素时能够快速访问。

以下是一段Java实现的示例代码:

public class MyStack<T> {
    // 内部类,代表链表的节点
    private class Node {
        // 数据
        private T data;
        // 下一节点
        private Node next;
        // 构造函数
        public Node(T data, Node next) {
            this.data = data;
            this.next = next;
        }
    }
    // 栈顶节点
    private Node top = null;
    // 栈的大小
    private int size = 0;

    // 压入元素
    public void push(T data) {
        // 新建节点
        Node newNode = new Node(data, top);
        // 更新栈顶
        top = newNode;
        // 更新大小
        size++;
    }

    // 弹出栈顶元素
    public T pop() throws Exception {
        if (top == null) {
            throw new Exception("Stack is empty!");
        }
        // 取出栈顶元素
        T data = top.data;
        // 更新栈顶
        top = top.next;
        // 更新大小
        size--;
        return data;
    }

    // 获取栈顶元素
    public T peek() throws Exception {
        if (top == null) {
            throw new Exception("Stack is empty!");
        }
        return top.data;
    }

    // 判断栈是否为空
    public boolean isEmpty() {
        return top == null;
    }

    // 获取栈的大小
    public int getSize() {
        return size;
    }
}

队列的实现

队列也是可以使用数组或链表来实现,这里我们采用链表实现。一个队列包含两个主要操作:入队(enqueue)和出队(dequeue)。在链表实现中,我们需要每次将新元素插入链表的尾部,同时我们也需要记录队列的头部和尾部位置,以便在出队时能够快速访问。

以下是一段Java实现的示例代码:

public class MyQueue<T> {
    // 内部类,代表链表的节点
    private class Node {
        // 数据
        private T data;
        // 下一节点
        private Node next;
        // 构造函数
        public Node(T data, Node next) {
            this.data = data;
            this.next = next;
        }
    }
    // 队列头
    private Node head = null;
    // 队列尾
    private Node tail = null;
    // 队列大小
    private int size = 0;

    // 入队
    public void enqueue(T data) {
        // 新建节点
        Node newNode = new Node(data, null);
        if (tail == null) {
            // 如果队列为空,则头、尾节点都为新节点
            head = tail = newNode;
        } else {
            // 如果队列不为空,则将新节点插入到尾部
            tail.next = newNode;
            tail = newNode;
        }
        // 更新队列大小
        size++;
    }

    // 出队
    public T dequeue() throws Exception {
        if (head == null) {
            throw new Exception("Queue is empty!");
        }
        // 取出队列头元素
        T data = head.data;
        head = head.next;
        if (head == null) {
            // 如果出队后队列为空,则尾节点设为null
            tail = null;
        }
        // 更新队列大小
        size--;
        return data;
    }

    // 获取队列头元素
    public T getHead() throws Exception {
        if (head == null) {
            throw new Exception("Queue is empty!");
        }
        return head.data;
    }

    // 判断队列是否为空
    public boolean isEmpty() {
        return head == null;
    }

    // 获取队列大小
    public int getSize() {
        return size;
    }
}

示例说明

示例一

假设我们需要对一个字符串进行逆序输出,可以使用栈来实现。将字符串逐个字符压入栈中,然后依次弹出栈顶元素并输出即可。

以下是Java实现的示例代码:

public static void reverseString(String str) throws Exception {
    MyStack<Character> stack = new MyStack<>();
    // 将字符串逐个字符压入栈中
    for (int i = 0; i < str.length(); i++) {
        stack.push(str.charAt(i));
    }
    // 依次弹出栈顶元素并输出
    while (!stack.isEmpty()) {
        System.out.print(stack.pop());
    }
}

示例二

假设我们需要对一组数进行先进先出的排序,可以使用队列来实现。将数列中的数依次入队,然后依次将队列中的元素出队并输出即可。

以下是Java实现的示例代码:

public static void sortNumberList(int[] nums) throws Exception {
    MyQueue<Integer> queue = new MyQueue<>();
    // 将数列中的数依次入队
    for (int i = 0; i < nums.length; i++) {
        queue.enqueue(nums[i]);
    }
    // 依次出队并输出队列中的元素
    while (!queue.isEmpty()) {
        System.out.print(queue.dequeue() + " ");
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构专题解析之栈和队列的实现 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C语言数据结构深入探索顺序表

    C语言数据结构深入探索顺序表攻略 一、概述 顺序表是一种线性结构,是计算机程序中最常见的数据结构之一。在C语言中,顺序表可以用数组来实现。本篇文章将深入讲解顺序表的原理和实现方法,帮助读者加深对顺序表的理解,并掌握如何用C语言代码实现顺序表。 二、顺序表的定义和特点 顺序表是指用一组地址连续的存储单元依次存储线性表中的各个元素,用于表示具有相同数据类型的n个…

    数据结构 2023年5月17日
    00
  • MySQL索引结构详细解析

    MySQL索引结构是MySQL数据库中非常重要的一部分,它能够显著提升数据库查询效率。本文将详细解析MySQL索引结构,包括索引的基本概念、常见的索引类型、索引的创建、索引的使用和索引的优化等方面。 索引的基本概念 索引是一种数据结构,它可以加速数据库中的查询操作。索引一般是在表中一个或多个列上创建的,这些列的值被按照一定的规则存储在索引中。当查询时,可以通…

    数据结构 2023年5月17日
    00
  • 2021年最新Redis面试题汇总(1)

    下面我将为您详细讲解“2021年最新Redis面试题汇总(1)”的完整攻略。 1. Redis概述 首先,我们需要了解Redis是什么,以及它的特点和应用场景。 1.1 什么是Redis Redis是一种内存中的数据结构存储,可以用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合,并提供了丰富的功能,如事务、持久化、Lua…

    数据结构 2023年5月17日
    00
  • Redis高效率原因及数据结构分析

    Redis高效率原因及数据结构分析 Redis高效率的原因 Redis是一款高性能、高可靠性的内存数据库,其高效率的原因主要体现在以下几个方面: 1. 内存存储 Redis数据完全存储在内存中,而不是像传统的关系型数据库一样存储在磁盘中。内存的读写速度要远远快于磁盘的读写速度,因此Redis在数据读写时的速度非常快,能够达到每秒钟数百万次的读写操作。 2. …

    数据结构 2023年5月17日
    00
  • 【牛客小白月赛69】题解与分析A-F【蛋挞】【玩具】【开题顺序】【旅游】【等腰三角形(easy)】【等腰三角形(hard)】

    比赛传送门:https://ac.nowcoder.com/acm/contest/52441 感觉整体难度有点偏大。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 个人博客:www.eriktse.com A-蛋…

    算法与数据结构 2023年4月18日
    00
  • MySQL索引详解及演进过程及面试题延伸

    MySQL索引详解及演进过程及面试题延伸 索引的作用 在 MySQL 中,索引是一种数据结构,可用于快速查找和访问表中的数据。使用索引可以大大提高查询效率,特别是在大型数据表中。 索引可以看作是一本书中的目录,目录中列出了每个章节的页码,通过查询目录,读者可以快速找到感兴趣的章节。 索引的种类 MySQL 中支持多种类型的索引,下面我们介绍一下常见的索引类型…

    数据结构 2023年5月17日
    00
  • Java数据结构学习之栈和队列

    Java数据结构学习之栈和队列 什么是栈 栈(stack)是一种线性数据结构,它只能在一端进行插入和删除操作,这一端被称作栈顶(top)。栈的特点是先进后出(FILO,First-In-Last-Out),即最后进入的元素最先被删除。 栈的实现方式 栈可以使用数组或链表来实现。使用数组实现的栈称作顺序栈,使用链表实现的栈称作链式栈。以下是顺序栈的 Java …

    数据结构 2023年5月17日
    00
  • Java数据结构之线性表

    Java数据结构之线性表完整攻略 什么是线性表 线性表是n个数据元素的有限序列,其中数据元素的类型相同。线性表中含有首元素和末元素。若表中只有一个数据元素,则该数据元素既是首元素又是末元素,这个数据元素成为线性表的唯一元素。 线性表的基本操作 初始化操作 initList(List L):建立一个空的线性表L 插入操作 insert(List L, int …

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部