java 实现 stack详解及实例代码

Java 实现 Stack 详解及实例代码

什么是 Stack

Stack(堆栈)是一种存储数据的结构,其遵循后进先出(LIFO)的原则。在 Stack 中,只有在栈顶的元素才能被访问、删除或更新,而其他的元素则需要等待栈顶元素先被操作。

Stack 的基本操作

Stack 可以执行以下操作:

  • push:将数据项压入 stack 的顶部。
  • pop:弹出 stack 的顶部数据项,并将其返回。
  • peek:返回 stack 的顶部数据项。
  • isEmpty:判断 stack 是否为空。
  • size:返回 stack 内元素的数量。

Stack 的实现

在 Java 中,我们可以使用 java.util.Stack 类来实现 Stack。

下面是一个示例代码,演示了如何创建一个 Stack 对象、将数据项压入 Stack、从 Stack 取出数据项等基本操作:

import java.util.Stack;

public class MyStack {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();

        stack.push(10);
        stack.push(20);
        stack.push(30);

        int popped = stack.pop();
        System.out.println("Popped item: " + popped);

        int peeked = stack.peek();
        System.out.println("Peeked item: " + peeked);

        System.out.println("Is the stack empty? " + stack.isEmpty());
        System.out.println("The size of the stack is: " + stack.size());
    }
}

在上面的代码中,我们首先创建了一个 Stack 对象 stack,并依次将数字 10、20、30 压入 Stack 中。然后我们取出栈顶元素(30),将其弹出并打印。接着我们获取栈顶元素(20),不弹出并打印。最后我们通过 isEmpty()size() 方法检查 Stack 是否为空,以及 Stack 中元素的数量。

Stack 的示例应用

示例1:检查字符串中的括号是否匹配

假设有一个包含括号(()[]{})的字符串,现在需要检查其中的括号是否匹配。我们可以使用 Stack 来实现括号匹配的功能。

下面是一个示例代码:

import java.util.Stack;

public class CheckBrackets {
    public static boolean check(String str) {
        Stack<Character> stack = new Stack<>();

        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            if (ch == '(' || ch == '[' || ch == '{') {
                stack.push(ch);
            } else if (ch == ')' || ch == ']' || ch == '}') {
                if (stack.isEmpty()) {
                    return false;
                }
                char top = stack.peek();
                if ((ch == ')' && top == '(') || (ch == ']' && top == '[') || (ch == '}' && top == '{')) {
                    stack.pop();
                } else {
                    return false;
                }
            }
        }

        return stack.isEmpty();
    }

    public static void main(String[] args) {
        String str1 = "{({[]})}";
        String str2 = "{([)]}";
        String str3 = "([]})";

        System.out.println(str1 + " is " + (check(str1) ? "" : "NOT ") + "valid");
        System.out.println(str2 + " is " + (check(str2) ? "" : "NOT ") + "valid");
        System.out.println(str3 + " is " + (check(str3) ? "" : "NOT ") + "valid");
    }
}

在上面的代码中,我们定义了一个 check() 方法,用于检查输入的字符串中的括号是否匹配。首先我们创建一个 Stack 对象 stack,并扫描字符串中的每个字符,如果字符是左括号,则将其压入 Stack 中。如果字符是右括号,则我们从 Stack 中获取栈顶元素(即与该右括号对应的左括号),如果不匹配则返回 false,否则弹出左括号并继续扫描。最后,如果 Stack 是空的,则表示括号匹配成功,返回 true,否则返回 false

我们可以运行上面的代码,得到如下输出:

{({[]})} is valid
{([)]} is NOT valid
([]}) is NOT valid

示例 2:使用 Stack 模拟迷宫寻路

在这个示例中,我们将使用 Stack 来解决经典游戏“迷宫寻路”。假设有一个迷宫地图,其中包含了若干个小区域,并且相邻的小区域之间可能有通路。现在我们需要从地图的起点开始寻找终点。我们可以将地图抽象为一个二维数组,并使用 Stack 中存储当前所在的坐标及路径信息。

下面是一个示例代码:

import java.util.Stack;

public class Maze {
    private static int[][] map = { 
            { 1, 1, 1, 1, 1, 1, 1 },
            { 1, 0, 0, 0, 0, 0, 1 },
            { 1, 0, 1, 1, 0, 0, 1 },
            { 1, 0, 0, 1, 0, 0, 1 },
            { 1, 0, 0, 1, 1, 0, 1 },
            { 1, 0, 0, 0, 0, 0, 1 },
            { 1, 0, 1, 1, 1, 1, 1 } 
    };
    private static int[][] directions = {
            {-1, 0}, // 上
            {0, 1},  // 右
            {1, 0},  // 下
            {0, -1}  // 左
    };
    private static Stack<int[]> stack = new Stack<>();

    public static boolean search(int startRow, int startCol, int endRow, int endCol) {
        stack.push(new int[] { startRow, startCol });

        while (!stack.isEmpty()) {
            int[] current = stack.pop();
            if (current[0] == endRow && current[1] == endCol) {
                return true;
            }

            for (int[] direction : directions) {
                int newRow = current[0] + direction[0];
                int newCol = current[1] + direction[1];
                if (newRow >= 0 && newRow < map.length && newCol >= 0 && newCol < map[0].length
                        && map[newRow][newCol] == 0) {
                    stack.push(new int[] { newRow, newCol });
                    map[newRow][newCol] = 2;
                }
            }
        }

        return false;
    }

    public static void main(String[] args) {
        boolean success = search(1, 1, 5, 5);

        if (success) {
            System.out.println("Path found!");
        } else {
            System.out.println("Path not found.");
        }
    }
}

在上面的代码中,我们首先定义了一个地图数组 map 和一个方向数组 directions,用于表示可以走的方向。我们使用 Stack 对象 stack 存储当前所在的坐标及路径信息。

search() 方法中,我们将起点的坐标压入 Stack 中,并执行以下操作:

  • 从 Stack 中取出栈顶元素。
  • 如果当前元素为终点,则返回 true。
  • 否则,对当前元素的四个方向进行遍历,判断是否可以走(即是否越界或者已经走过),如果可以,则将该位置的坐标压入 Stack 中,并记录该位置已经走过。

我们可以运行上面的代码,得到如下输出:

Path found!

这表示我们从起点(1, 1)出发可以找到终点(5, 5)。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 实现 stack详解及实例代码 - Python技术站

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

相关文章

  • 浅谈SpringBoot之事务处理机制

    浅谈SpringBoot之事务处理机制 什么是事务? 事务是指一系列数据库操作(insert、update、delete等),要么全部完成,要么全部回滚,如果其中任何一个操作失败,整个事务将回滚到起点。 在Spring Boot中,可以使用@Transactional注解来声明一个事务,这样在方法执行时就会被视为一个事务,并启用该方法中的所有数据库操作,这个…

    Java 2023年5月15日
    00
  • Java 数据结构之堆的概念与应用

    Java 数据结构之堆的概念与应用 堆的概念 在计算机科学中,堆(Heap)是一种特殊的数据结构,是一棵树,每个父节点的键值都小于其子节点的键值,这样的堆成为小根堆(Min Heap),反之成为大根堆(Max Heap)。在堆中没有父子关系的节点之间也没有其他约束关系。常见的堆有二叉堆、斐波那契堆等。 对于小顶堆,任意节点的键值都小于或等于其子节点的键值,根…

    Java 2023年5月26日
    00
  • Java杂谈之类和对象 封装 构造方法以及代码块详解

    Java杂谈之类和对象 封装 构造方法以及代码块详解 类和对象 Java是面向对象编程的语言,类是Java强大的概念之一。类是一组字段和方法的集合,用于表示某些相关的状态和行为。 在Java中,对象是类的实例。对象是通过类构造函数创建的,类构造函数定义了如何创建对象。按照惯例,类名应该以大写字母开头。 在Java中,类可以有任意数量的方法和成员,这些方法和成…

    Java 2023年5月26日
    00
  • Spring cloud oauth2如何搭建认证资源中心

    Spring Cloud Oauth2是Spring Cloud生态中基于Oauth2.0协议实现的授权、认证框架。它将授权、认证、鉴权的功能进行了拆分,将获得token的过程分离出来形成一个微服务,我们可以称之为认证服务认证中心,而资源服务需要鉴权的时候可以通过Feign请求认证服务获取token后再访问资源服务。下面是搭建认证资源中心的详细攻略。 1. …

    Java 2023年5月20日
    00
  • SpringBoot项目打成War布署在Tomcat的详细步骤

    下面为您介绍SpringBoot项目打成War包并部署在Tomcat的详细步骤。 一、将SpringBoot项目转化为War包 在pom.xml文件中修改packaging为war,添加servlet-api依赖。 <packaging>war</packaging> <!– 添加servlet-api依赖 –> &l…

    Java 2023年5月19日
    00
  • IDEA2020.1创建springboot项目(国内脚手架)安装lombok

    这里是创建Spring Boot项目并安装Lombok的完整攻略。 准备工作 在开始之前,需要先确保已经在电脑上安装好以下软件:- JDK(Java开发工具包)- IntelliJ IDEA 2020.1(社区版或旗舰版均可) 创建Spring Boot项目 打开 IntelliJ IDEA,选择 “Create New Project” 创建新项目。 在左…

    Java 2023年5月19日
    00
  • Springboot实现高吞吐量异步处理详解(适用于高并发场景)

    Spring Boot实现高吞吐量异步处理详解 在高并发场景下,异步处理是提高系统吞吐量的一种有效方式。Spring Boot提供了多种异步处理方式,本文将详细介绍如何使用Spring Boot实现高吞吐量异步处理,并提供两个示例。 异步处理方式 Spring Boot提供了多种异步处理方式,包括: 使用@Async注解实现异步方法调用。 使用Complet…

    Java 2023年5月15日
    00
  • Java 网络爬虫基础知识入门解析

    Java 网络爬虫基础知识入门解析 概述 网络爬虫是一种通过编程方式自动化提取互联网上数据的技术。对于Java开发者而言,使用Java的网络爬虫应该会是最自然的想法。本文将介绍Java网络爬虫的基础知识,以及如何使用Java实现一个网络爬虫。 爬虫原理 一个基本的网络爬虫需要完成以下几个步骤: 发送HTTP请求获取页面内容 解析获取到的页面内容 保存所需的数…

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