Java实现链栈的示例代码

yizhihongxing

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日

相关文章

  • SpringAop @Aspect织入不生效,不执行前置增强织入@Before方式

    在Spring AOP中,我们可以使用@Aspect注解来定义切面,并使用@Before注解来定义前置增强。但是有时候,我们可能会遇到@Aspect织入不生效的问题,即前置增强不执行。本文将详细介绍如何解决@Aspect织入不生效的问题,并提供两个示例说明。 1. 解决@Aspect织入不生效的问题 在解决@Aspect织入不生效的问题时,我们可以采取以下措…

    Java 2023年5月18日
    00
  • java学生管理系统界面简单实现(全)

    下面是“java学生管理系统界面简单实现(全)”的完整攻略。 简介 “java学生管理系统界面简单实现(全)”是一篇教程,它详细介绍了如何使用Java语言实现一个学生信息管理系统。该教程包含的内容主要涉及Java Swing图形界面编程、MySQL数据库使用以及Java与MySQL之间的数据交互等方面。 步骤 下面是实现这个系统的主要步骤: 1. 创建项目并…

    Java 2023年5月19日
    00
  • 详谈hibernate,jpa与spring data jpa三者之间的关系

    详谈hibernate,jpa与spring data jpa三者之间的关系 什么是Hibernate? Hibernate是一个开源的ORM(Object Relational Mapping)框架,旨在通过映射Java对象和数据库表,将数据持久化到数据库中。Hibernate执行了许多数据库操作并自动处理所有底层细节,使得编写数据访问层的代码变得更简单。…

    Java 2023年6月3日
    00
  • SpringBoot前后端分离实现个人博客系统

    下面是详细讲解“SpringBoot前后端分离实现个人博客系统”的完整攻略,包括两条示例。 前言 本文通过SpringBoot、Vue.js等技术实现了一个前后端分离的个人博客系统,并介绍了实现的详细过程和注意事项。 实现步骤 后端实现 使用SpringBoot初始化项目,并添加必要依赖。例如,我们需要在pom.xml中添加以下配置以引入SpringBoot…

    Java 2023年5月20日
    00
  • Java过滤器filter_动力节点Java学院整理

    Java过滤器filter_动力节点Java学院整理 什么是Java过滤器 Java中的过滤器(Filter),是一种能够拦截请求或响应,对请求或响应进行预处理或后处理的东西。当然,这个东西不是完全地由Java语言实现的,实际上它是由Servlet规范中定义的,所以Java中的Filter更准确地讲应该叫做Servlet Filter。Filter实际上是基…

    Java 2023年6月15日
    00
  • JAVA对象和字节数组互转操作

    Java对象和字节数组互转操作是Java编程中常见的技巧之一。在某些情况下,我们需要把Java对象序列化成字节数组,再把字节数组反序列化为Java对象,这样可以在网络传输、文件存储等场景中实现数据的传输和存储。本文以Java 8为例,讲解Java对象和字节数组互转的完整攻略。 1. Java对象转字节数组 Java对象转字节数组需要使用到Java的序列化机制…

    Java 2023年5月26日
    00
  • Android实现上传文件功能的方法

    Android实现上传文件功能的方法主要有两种:使用HttpURLConnection或使用OkHttp库。 使用HttpURLConnection上传文件 步骤一:添加网络权限 在AndroidManifest.xml文件中添加以下权限: <uses-permission android:name="android.permission.I…

    Java 2023年6月15日
    00
  • Java基础教程之包(package)

    Java基础教程之包(package) 在 Java 中,包(package)是一种用于组织及管理类、接口及其他资源的机制。包可以看成是文件夹,类则是文件,利用类放在包中,可以更好地组织和访问代码。 包的定义 在 Java 中,一个包是一组相互关联的 Java 类的集合。 当需要用到某个类时,可以指定其完全限定名(包括包名称和类名)来引用该类,例如: jav…

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