Java链表实现栈并动态扩容

在计算机科学中,栈是一种后进先出(LIFO)的数据结构,常用于函数调用、表达式求值等场景。本篇文章将介绍如何使用 Java 中的链表实现一个动态扩容的栈。

什么是链表?

链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组相比,链表在插入和删除元素时更为高效,因为它不需要移动其他元素。

实现思路

在我们的链表栈实现中,将使用链表节点构建栈的基本结构。每个栈节点将包含数据和指向下一个节点的指针。此外,我们还将加入栈的基本操作,例如入栈、出栈和查栈顶元素。

代码示例

以下是基于链表实现的栈的简单 Java 代码:

class Node {
    int data;
    Node next;

    Node(int data) {
        this.data = data;
        this.next = null;
    }
}

class LinkedListStack {
    private Node top;  // 栈顶节点

    public LinkedListStack() {
        this.top = null; // 初始化时栈为空
    }

    // 入栈操作
    public void push(int data) {
        Node newNode = new Node(data); // 创建新节点
        newNode.next = top; // 新节点指向当前的栈顶
        top = newNode; // 更新栈顶为新节点
    }

    // 出栈操作
    public int pop() {
        if (isEmpty()) {
            throw new RuntimeException("栈为空,无法出栈。");
        }
        int poppedData = top.data; // 获取栈顶数据
        top = top.next; // 更新栈顶为下一个节点
        return poppedData; // 返回被弹出的数据
    }

    // 查看栈顶元素
    public int peek() {
        if (isEmpty()) {
            throw new RuntimeException("栈为空,无法查看栈顶元素。");
        }
        return top.data; // 返回栈顶数据
    }

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

在上述代码中,我们定义了一个 Node 类来表示链表的节点,并通过 LinkedListStack 类实现栈的功能。主要操作包括入栈(push)、出栈(pop)、查看栈顶元素(peek)以及判断栈是否为空(isEmpty)。

动态扩容简介

栈的动态扩容是指在栈满时,自动增加栈的容量,以便能够继续添加元素。由于这是基于链表的实现,因此无需担心容量问题,因为链表的节点可以动态地分配内存。然而,为了阐明动态扩容的概念,可以考虑基于数组的栈实现,通常在栈满时通过创建一个更大的数组并复制原有元素来扩容。

旅行图示例

下面是一个使用 Mermaid 语法表示的旅行图,展示了栈的操作过程:

journey
    title 栈的入栈和出栈过程
    section 入栈操作
      入栈 1: 5: 人员A
      入栈 2: 10: 人员B
      入栈 3: 15: 人员C
    section 出栈操作
      出栈 1: 15: 人员C
      出栈 2: 10: 人员B

结尾

本文介绍了如何使用 Java 的链表实现栈,并解释了动态扩容的概念。链表结构的灵活性使得栈在处理动态数据时格外有效。希望通过本文的学习,大家能够更深入地理解栈的基本操作,并掌握链表的基本使用技巧。

无论是在算法学习还是实际编程中,灵活运用数据结构对提升效率和性能具有重要作用。请继续探索更多数据结构和算法,为你的编程之旅添砖加瓦!