Java实现链栈的示例代码

Java链栈是一种特殊的栈,底层是使用单向链表实现的,相比较数组实现栈的方式,链栈可以无需考虑容量的问题,能够动态地适应数据结构的需求。下面详细讲解Java实现链栈的示例代码的完整攻略。

1. 实现链栈的基本步骤

Java实现链栈的基本步骤如下:

  1. 定义链栈的节点类
  2. 定义链栈类,包含入栈、出栈、查看栈顶数据等方法
  3. 在链栈类中,定义一个栈顶节点对象,然后在入栈、出栈等方法中对栈顶节点进行操作。

2. 链栈的节点类定义

链栈的节点类定义如下:

public class LinkNode<T> {  // 泛型类型动态传递

    public T data;   // 存放数据

    public LinkNode<T> next;     // 指向节点的下一个节点

    public LinkNode(T data) {    // 构造方法,用于创建节点
        this.data = data;        // 初始化数据
        this.next = null;        // 新节点没有后继节点,所以初始化为null
    }
}

因为链栈底层是单向链表,所以定义节点类时需要包含下一个节点的指针和数据。

3. 链栈类定义

链栈类的定义如下:

public class LinkStack<T> {

    private LinkNode<T> top;    // 栈顶指针

    public LinkStack() {
        top = null;
    }

    /**
     * 入栈
     * @param data 数据
     */
    public void push(T data) {
        LinkNode<T> node = new LinkNode<T>(data);
        node.next = top;
        top = node;
    }

    /**
     * 出栈
     * @return 返回出栈元素
     */
    public T pop() {
        if (isEmpty()) {
            return null;
        }
        T data = top.data;
        top = top.next;
        return data;
    }

    /**
     * 查看栈顶数据
     * @return 返回栈顶元素
     */
    public T peek() {
        if (isEmpty()) {
            return null;
        }
        return top.data;
    }

    /**
     * 判断栈是否为空
     * @return true为空,false不为空
     */
    public boolean isEmpty() {
        return top == null;
    }
}

通过节点类中的next指针,可以将节点串起来组成单向链表,然后在链栈类中,定义一个栈顶指针对象top,表示链栈的栈顶节点。在入栈操作时,新建一个节点对象,并将该节点对象的next指针指向top,然后将top指向该节点。在出栈操作时,先判断链栈是否为空,不为空则将栈顶节点出栈,并将top指针下移。

4. 示例说明

下面通过两个示例说明如何使用Java实现链栈:

示例1:将字符串中的字符逆序压入栈中

public static void reverseString(String str) {
    LinkStack<Character> stack = new LinkStack<>();
    for (int i = 0; i < str.length(); i++) {
        stack.push(str.charAt(i));
    }
    while (!stack.isEmpty()) {
        System.out.print(stack.pop());
    }
}

首先创建一个LinkStack对象stack,然后从左往右遍历字符串中的字符,将每个字符压入栈中。然后通过调用pop()方法,将栈中的字符依次出栈,即可达到逆序的效果。该示例中使用到了栈的特性:先进后出。

示例2:使用链栈解决表达式求值问题

public static int calculate(String str) {
    LinkStack<Integer> numbers = new LinkStack<>();  // 存放操作数的栈
    LinkStack<Character> operators = new LinkStack<>();  // 存放运算符的栈
    int length = str.length();
    for (int i = 0; i < length; i++) {
        char c = str.charAt(i);
        if (Character.isDigit(c)) {
            int number = c - '0';
            while (i + 1 < length && Character.isDigit(str.charAt(i + 1))) {
                // 如果下一个字符是数字,则构成多位数
                number = number * 10 + (str.charAt(i + 1) - '0');
                i++;
            }
            numbers.push(number);
        } else if (c == '+' || c == '-') {
            while (!operators.isEmpty()) {
                int a = numbers.pop();
                int b = numbers.pop();
                char op = operators.pop();
                if (op == '+') {
                    numbers.push(b + a);
                } else if (op == '-') {
                    numbers.push(b - a);
                }
            }
            operators.push(c);
        }
    }
    while (!operators.isEmpty()) {
        int a = numbers.pop();
        int b = numbers.pop();
        char op = operators.pop();
        if (op == '+') {
            numbers.push(b + a);
        } else if (op == '-') {
            numbers.push(b - a);
        }
    }
    return numbers.pop();
}

该示例中使用到了两个链栈:一个存放操作数的栈numbers,和一个存放运算符的栈operators。该示例实现了简单的四则运算,仅考虑加减运算,通过对比运算符优先级,调用相应的方法进行计算。该示例中同样使用到了栈的特性:后进先出。

以上两个示例说明了链栈在实际问题中的应用,可以根据实际需求灵活使用链栈。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现链栈的示例代码 - Python技术站

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

相关文章

  • python实现JAVA源代码从ANSI到UTF-8的批量转换方法

    下面是“python实现JAVA源代码从ANSI到UTF-8的批量转换方法”的完整攻略: 1. 安装Python 如果你的电脑上还没有Python,需要先安装Python。 请前往 https://www.python.org/downloads/ 下载并安装Python。 2. 编写Python代码 接下来需要编写Python代码来实现批量转换功能。具体代…

    Java 2023年5月20日
    00
  • Vue+java实现时间段的搜索示例

    下面是 “Vue+java实现时间段的搜索示例” 的完整攻略: 1. 准备工作 首先,我们需要准备后端接口,即搜索 API。我们可以使用 Java 和 Spring Boot 搭建一个简单的后端程序,提供时间段的搜索服务。具体实现可以参考 Spring Boot 官方文档。 接下来,我们需要准备前端框架。我们可以使用 Vue.js 来搭建一个简单的用户界面。…

    Java 2023年5月20日
    00
  • 全网最详细Hutool工具详解

    全网最详细Hutool工具详解 Hutool是一个Java工具库,封装了一系列的工具类,包括字符串、集合、日期时间、加密解密、文件、图片处理、网络等等常用工具,简化了Java开发中的常见操作,提高了开发效率。 字符串工具 判断字符串是否为空 String str = null; boolean empty = StrUtil.isEmpty(str);//t…

    Java 2023年5月20日
    00
  • 一篇文章带你入门Java方法详解

    一篇文章带你入门Java方法详解 Java是一门面向对象的编程语言,方法是Java中基本的编程元素之一。方法是一个可以重复使用的代码块,它可以帮助程序员避免重复书写相同的代码,提高代码的复用性和可维护性。如果你正在学习Java,那么方法绝对是必须掌握的知识点之一。本文将通过详细的实例讲解Java方法的基础知识。 Java方法的定义和语法 Java方法是指在类…

    Java 2023年5月19日
    00
  • mybatis中的mapper.xml使用循环语句

    MyBatis是Java企业级应用中常用的持久化框架之一。在MyBatis中,mapper.xml是定义SQL语句的重要文件,循环语句是在mapper.xml中进行数据处理的常用方式之一。本文将从以下几个方面,详细讲解MyBatis中的mapper.xml使用循环语句的完整攻略: MyBatis中支持哪些类型的循环语句 MyBatis中如何编写循环语句 在M…

    Java 2023年5月20日
    00
  • idea中创建jsp项目的详细实战步骤

    下面是在IDEA中创建JSP项目的详细实战步骤: 步骤一 创建项目 打开IDEA,点击“Create New Project”按钮。 选择“Java Enterprise”项目类型,然后点击“Next”。 在“Project SDK”下拉框中选择JDK版本,然后点击“Next”。 输入项目名称和项目路径,然后点击“Finish”。 步骤二 添加Web模块 打…

    Java 2023年6月15日
    00
  • java二维数组基础知识详解

    Java二维数组基础知识详解 什么是Java二维数组? Java二维数组是一种特殊的数组类型,它是由多个一维数组组成的,通常用于表示矩阵和表格等情景。Java二维数组的每个元素都是一个数组,这个数组里面又包含了多个元素。 Java二维数组的定义与初始化 Java二维数组的定义格式为 数据类型[][] 数组名 = new 数据类型[行数][列数]。其中,行数和…

    Java 2023年5月26日
    00
  • Java 创建线程的两个方法详解及实例

    Java 创建线程的两个方法详解及实例 在 Java 中,创建线程有两种方法,一种是继承Thread类,另一种是实现Runnable接口。本文将详细介绍这两种方法并提供示例代码。 1. 继承Thread类 继承Thread类是一种创建线程的简单方法,只需要继承Thread类并重写run方法即可。 示例代码: public class MyThread ext…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部