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语言详解霍夫曼树数据结构 什么是霍夫曼树 霍夫曼树是一种带权路径长度最短的树,也称为最优二叉树,它是优化编码的核心算法。 在霍夫曼树中,每个叶子节点对应一个字符,该节点的权值为该字符出现的次数。当然,字符可以是任何数据类型。生成霍夫曼树后,在对每个字符进行编码时,字符在霍夫曼树中的路径即为其编码。(一般规定,一条从根到叶子的路径上只出现0或1,从根到某…

    数据结构 2023年5月17日
    00
  • C#常用数据结构和算法总结

    C#常用数据结构和算法总结 数据结构 数组(Array) 数组是一种线性数据结构,它可以在内存中连续地存储相同类型的数据。可以使用索引访问数组中的元素。数组的元素可以是任意类型。 在 C# 中,定义一个数组需要指定数组的类型和数组的大小。例如,定义一个包含 5 个整数的数组: int[] arr = new int[5]; 链表(LinkedList) 链表…

    数据结构 2023年5月17日
    00
  • Java数据结构之图(动力节点Java学院整理)

    Java数据结构之图是动力节点Java学院整理的一篇关于图的攻略教程,该教程包含以下主要内容: 一、图的定义 图是由若干个顶点以及它们之间的相互关系所构成的数学模型。它包含了许多实际生活中的应用,如社交网络、地图、电子邮件网络等。 二、图的存储方式 图的存储方式有两种:邻接矩阵和邻接表。 邻接矩阵 邻接矩阵以二维数组的形式存储图。对于有n个顶点的图,其邻接矩…

    数据结构 2023年5月17日
    00
  • Android开发数据结构算法ArrayList源码详解

    Android开发数据结构算法ArrayList源码详解 概述 Android开发中,大量使用到了数据结构和算法,ArrayList便是其中的一种非常重要的数据结构。ArrayList是Java中非常重要且使用率非常高的一种数据结构,Android开发中也经常使用它来存储数据。本文将深入探究ArrayList的源码,帮助读者更好地理解其工作原理和使用方法。 …

    数据结构 2023年5月17日
    00
  • Java数据结构的十大排序

    Java数据结构的十大排序攻略 简介 在计算机科学中,排序算法是一种将一串数据按照特定顺序进行排列的方法,其中常见的排序算法有很多种,不同的算法适用于不同的数据类型和数据规模。Java是一种常见的编程语言,也提供了很多实现排序算法的类和方法。 本文将介绍Java数据结构的十大排序算法,分别为:插入排序、希尔排序、选择排序、冒泡排序、快速排序、归并排序、堆排序…

    数据结构 2023年5月17日
    00
  • java数据结构之实现双向链表的示例

    Java数据结构之实现双向链表的示例 1. 什么是双向链表? 双向链表,英文名为doubly linked list,是一种链表结构。与单向链表不同,双向链表中的每一个节点除了保存了指向下一个节点的指针外,还保存了指向前一个节点的指针。因此,双向链表可双向遍历,可以从前向后或从后向前遍历。 2. 双向链表的实现 2.1 节点类的实现 创建节点类Node,并定…

    数据结构 2023年5月17日
    00
  • Java 详细分析四个经典链表面试题

    Java 详细分析四个经典链表面试题 简介 链表是数据结构中非常常见的一种形式,在Java中也有非常多的实现方式。本文将介绍Java中四个经典的链表面试题,并且详细分析它们的实现方法。在介绍每一个题目的详细实现之前,我们将简单介绍Java链表和链表常见操作。 Java链表 链表是一种线性结构,其中每个节点包含了一个数据域和一个指针域,指向下一个节点。Java…

    数据结构 2023年5月17日
    00
  • Lua教程(七):数据结构详解

    Lua教程(七):数据结构详解 Lua 中的数据结构广泛应用于各种计算机程序中。本文将详细介绍 Lua 中的数组、列表、栈、队列、集合和字典等数据结构的使用以及相关的函数。 数组 数组是存储在连续内存位置上的相同数据类型的元素集合。Lua 中的数组索引默认从 1 开始。下面是一些常用的 Lua 数组函数: table.concat(arr[, sep[, i…

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