当前位置: 首页 > news >正文

蓝桥杯 Java B 组之栈的应用(括号匹配、表达式求值)

  一、栈的基本概念

栈(Stack)是一种特殊的线性数据结构,遵循后进先出(Last In First Out,LIFO)的原则。就像一摞盘子,最后放上去的盘子总是最先被拿走。栈有两个主要操作:

     入栈(Push)  :将一个元素添加到栈的顶部。

     出栈(Pop)  :移除并返回栈顶部的元素。

  二、手写栈的实现

  java

class MyStack {private int[] array;  // 用于存储栈中的元素private int top;      // 栈顶指针,指向栈顶元素的索引private int capacity; // 栈的容量// 构造函数,初始化栈的容量public MyStack(int capacity) {this.capacity = capacity;this.array = new int[capacity];this.top =   1;  // 初始时栈为空,栈顶指针为   1}// 判断栈是否为空public boolean isEmpty() {return top ==   1;}// 判断栈是否已满public boolean isFull() {return top == capacity    1;}// 入栈操作public void push(int element) {if (isFull()) {System.out.println("栈已满,无法入栈");return;}array[++top] = element; // 先将栈顶指针加 1,再将元素放入栈顶}// 出栈操作public int pop() {if (isEmpty()) {System.out.println("栈为空,无法出栈");return   1;}return array[top    ]; // 先返回栈顶元素,再将栈顶指针减 1}// 获取栈顶元素public int peek() {if (isEmpty()) {System.out.println("栈为空,没有栈顶元素");return   1;}return array[top];}}

  

  三、栈的应用

    1. 有效的括号

     问题描述  :给定一个只包括 `'('`,`')'`,`'{'`,`'}'`,`'['`,`']'` 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合,左括号必须以正确的顺序闭合。

     思路  :遍历字符串,遇到左括号就将其入栈,遇到右括号就检查栈顶元素是否为对应的左括号,如果是则出栈,否则字符串无效。遍历结束后,如果栈为空,则字符串有效。

  java

import java.util.Stack;public class ValidParentheses {public static boolean isValid(String s) {Stack<Character> stack = new Stack<>();for (char c : s.toCharArray()) {if (c == '(' || c == '{' || c == '[') {stack.push(c); // 遇到左括号,入栈} else {if (stack.isEmpty()) {return false; // 栈为空,遇到右括号,无效}char top = stack.pop(); // 出栈栈顶元素if ((c == ')' && top != '(') || (c == '}' && top != '{') || (c == ']' && top != '[')) {return false; // 括号不匹配,无效}}}return stack.isEmpty(); // 栈为空则有效}public static void main(String[] args) {String s = "()[]{}";System.out.println(isValid(s));}}

  

    2. 逆波兰表达式求值

     问题描述  :逆波兰表达式(后缀表达式)是一种数学表达式的表示方法,其中运算符紧跟在操作数之后。给定一个逆波兰表达式,求其值。

     思路  :遍历逆波兰表达式,遇到操作数就入栈,遇到运算符就从栈中弹出两个操作数进行运算,再将结果入栈。遍历结束后,栈中剩下的元素就是表达式的值。

  java

import java.util.Stack;public class EvaluateReversePolishNotation {public static int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();for (String token : tokens) {if (isOperator(token)) {int operand2 = stack.pop(); // 弹出第二个操作数int operand1 = stack.pop(); // 弹出第一个操作数int result = applyOperation(operand1, operand2, token); // 进行运算stack.push(result); // 将结果入栈} else {stack.push(Integer.parseInt(token)); // 遇到操作数,入栈}}return stack.pop(); // 栈中剩下的元素就是表达式的值}// 判断是否为运算符private static boolean isOperator(String token) {return token.equals("+") || token.equals("  ") || token.equals("*") || token.equals("/");}// 进行运算private static int applyOperation(int operand1, int operand2, String operator) {switch (operator) {case "+":return operand1 + operand2;case "  ":return operand1    operand2;case "*":return operand1 * operand2;case "/":return operand1 / operand2;default:return 0;}}public static void main(String[] args) {String[] tokens = {"2", "1", "+", "3", "*"};System.out.println(evalRPN(tokens));}}

练习1:中缀转后缀表达式

规则:

操作数直接输出。

运算符与栈顶比较优先级,优先级高则入栈,否则弹出栈顶。

左括号入栈,右括号弹出直到左括号。

public String infixToPostfix(String infix) {MyStack<Character> stack = new MyStack<>();StringBuilder postfix = new StringBuilder();for (char c : infix.toCharArray()) {if (Character.isDigit(c)) {postfix.append(c);} else if (c == '(') {stack.push(c);} else if (c == ')') {while (!stack.isEmpty() && stack.peek() != '(') {postfix.append(stack.pop());}stack.pop(); // 弹出左括号} else {while (!stack.isEmpty() && priority(c) <= priority(stack.peek())) {postfix.append(stack.pop());}stack.push(c);}}while (!stack.isEmpty()) postfix.append(stack.pop());return postfix.toString();}

 蓝桥杯中的常考点和易错点

常考点:

栈的基本操作:push、pop、peek、isEmpty。

括号匹配:使用栈检查括号是否正确匹配。

逆波兰表达式求值:使用栈计算逆波兰表达式的值。

数据结构的实现:手写栈的实现,理解其内部机制。

易错点:

栈的边界条件:容易忽略栈为空或栈满的情况,导致运行时错误。

括号匹配的逻辑:容易在处理右括号时忘记检查栈是否为空。

逆波兰表达式的操作符处理:容易在计算时混淆操作数的顺序,尤其是减法和除法。

数组越界:在实现栈时,容易因为数组越界而出现错误。

6. 相关知识点总结

栈的实现:使用数组或链表实现栈的基本操作。

括号匹配:通过栈检查括号是否正确匹配。

逆波兰表达式求值:通过栈计算逆波兰表达式的值。

蓝桥杯常考点:栈的基本操作、括号匹配、逆波兰表达式求值。

易错点:栈的边界条件、括号匹配的逻辑、逆波兰表达式的操作符处理。

  四、知识点总结

     栈的特性  :后进先出(LIFO),适用于需要处理最近发生的元素的场景。

     栈的基本操作  :入栈(Push)、出栈(Pop)、获取栈顶元素(Peek)、判断栈空(isEmpty)和栈满(isFull)。

     栈的应用场景  :括号匹配、表达式求值等。在括号匹配中,利用栈来检查括号的闭合顺序;在表达式求值中,使用栈来处理操作数和运算符的运算顺序。

  五、蓝桥杯常考点

     栈的基本操作实现  :可能要求选手手写栈的实现,包括入栈、出栈等操作。

     栈的应用问题  :如括号匹配、表达式求值等经典问题,考查选手对栈的理解和应用能力。

     复杂度分析  :要求分析栈操作和相关算法的时间复杂度和空间复杂度。

  六、蓝桥杯易错点

     栈的边界条件处理  :在入栈和出栈操作时,要注意栈空和栈满的情况,避免出现数组越界等错误。

     运算符优先级问题  :在表达式求值中,要正确处理运算符的优先级,确保运算顺序正确。

     数据类型转换  :在处理逆波兰表达式求值时,要注意将字符串转换为合适的数据类型进行运算。

相关文章:

蓝桥杯 Java B 组之栈的应用(括号匹配、表达式求值)

一、栈的基本概念 栈&#xff08;Stack&#xff09;是一种特殊的线性数据结构&#xff0c;遵循后进先出&#xff08;Last In First Out&#xff0c;LIFO&#xff09;的原则。就像一摞盘子&#xff0c;最后放上去的盘子总是最先被拿走。栈有两个主要操作&#xff1a; 入栈&…...

Hive之分区表

Hive之分区表 文章目录 Hive之分区表写在前面分区表分区表基本操作引入分区表创建分区表语法加载数据到分区表中查询分区表中数据增加分区删除分区查看分区表有多少分区查看分区表结构 二级分区正常的加载数据分区表和数据产生关联 动态分区开启动态分区参数设置案例实操 写在前…...

Redis之持久化

1.前言 Redis⽀持RDB和AOF两种持久化机制&#xff0c;持久化功能有效地避免因进程退出造成数据丢失问题&#xff0c; 当下次重启时利⽤之前持久化的⽂件即可实现数据恢复。本文内容&#xff1a; • 介绍RDB、AOF的配置和运⾏流程&#xff0c;以及控制持久化的命令&#xff0c;…...

有关计算机的英语单词、短语、句子

基本计算机术语 Computer – 计算机 Hardware – 硬件 Software – 软件 Operating System (OS) – 操作系统 Processor (CPU) – 处理器&#xff08;中央处理单元&#xff09; Memory (RAM) – 内存&#xff08;随机存取存储器&#xff09; Storage – 存储 Disk Drive – 硬…...

String、StringBuffer、StringBuilder 区别

在 Java 编程中&#xff0c;String、StringBuffer 和 StringBuilder 是处理字符串时常用的类。它们在功能上有相似之处&#xff0c;但在内部实现、性能、线程安全性等方面存在显著差异。理解这些差异有助于开发者在不同的场景下做出合适的选择&#xff0c;提高代码的性能和效率…...

shell——分支语句

文章目录 基本语法常用判断条件(1)两个整数之间比较&#xff08;2&#xff09;按照文件权限进行判断&#xff08;3&#xff09;按照文件类型进行判断&#xff08;4&#xff09;多条件判断&#xff08;&& 表示前一条命令执行成功时&#xff0c;才执行后一条命令&#xf…...

【vue3】实现pdf在线预览的几种方式

今天一天对当前可用的pdf预览插件做了测试&#xff0c;主要需求是只能预览不能下载&#xff0c;但对于前端来说&#xff0c;没有绝对的禁止&#xff0c;这里只罗列实现方式。 目前采用vue3版本为&#xff1a;3.2.37 iframevue-officepdfjs-dist iframe 先说最简单的&#xf…...

(学习总结22)Linux 基本指令1

Linux 基本指令1 基本指令当前目录信息指令 ls查看路径指令 pwd改变当前所在目录指令 cd创建或更改文件时间指令 touch创建目录指令 mkdir删除空目录指令 rmdir删除指令 rm查阅手册指令 man拷贝文件指令 cp移动文件指令 mv打印内容指令 echo 查看指令查找文件指令 find查看指令…...

Linux:用 clang 编译带 sched_ext 功能内核

文章目录 1. 前言2. 编译过程2.1 准备内核源代码2.2 安装编译工具2.3 配置、编译、运行2.3.1 配置2.3.2 编译2.3.3 运行 3. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 编译过程 …...

Redis 的集群 --- 数据分开扛

序言 上一章内容中我们介绍到了 哨兵 来保证我们主机在发生故障时能够及时地选出一个新的主机&#xff0c;但是哨兵地加入只是提供了 高可用性 和 故障转移&#xff0c;并没有真正的提升架构的性能。如果不断地加入新的数据的话&#xff0c;主机的压力会很大&#xff0c;一方面…...

微信小程序中缓存数据全方位解惑

微信小程序中缓存数据全方位解惑 微信小程序中的数据缓存是提升用户体验和优化性能的重要手段&#xff0c;跟电脑浏览器中的Local Storage的性质一样。以下是关于微信小程序数据缓存的相关知识点和示例的详细介绍&#xff1a; 1. 数据缓存的类型 微信小程序提供了两种数据缓…...

LeetCode 每日一题 2025/2/10-2025/2/16

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 2/10 913. 猫和老鼠2/11 1728. 猫和老鼠 II2/12 1760. 袋子里最少数目的球2/13 1742. 盒子中小球的最大数量2/14 1552. 两球之间的磁力2/15 1706. 球会落何处2/16 1299. 将…...

使用 Shiro 和 JPA 结合 MySQL 实现一个简易权限管理系统

1. 项目设置 首先&#xff0c;确保你的项目已经配置好 Maven 或 Gradle 依赖管理工具&#xff0c;并添加以下依赖&#xff1a; Maven 依赖 <dependencies><!-- Shiro 核心库 --><dependency><groupId>org.apache.shiro</groupId><artifactI…...

DeepSeek与医院电子病历的深度融合路径:本地化和上云差异化分析

一、引言 1.1 研究背景与意义 在医疗信息化快速发展的当下,电子病历系统已成为医院信息管理的核心构成。电子病历(EMR)系统,是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图标、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的…...

设计模式:代理模式

代理模式是很常见的设计模式&#xff0c;即使没有专门学习过这种设计模式&#xff0c;在工作中也一定用过这种设计模式。在实际生活中&#xff0c;代理模式也是常见的&#xff0c;比如内阁首辅相对于皇帝&#xff0c;前者是后者的代理&#xff0c;内阁首辅收到奏折时&#xff0…...

141,【1】buuctf web [SUCTF 2019]EasyWeb

进入靶场 代码审计 <?php // 定义函数get_the_flag&#xff0c;功能是处理文件上传相关操作 function get_the_flag() {// 注释说明&#xff1a;webadmin会每隔20分钟删除用户上传的文件$userdir "upload/tmp_" . md5($_SERVER[REMOTE_ADDR]);// 检查用户目录…...

破解微服务疑难杂症:2025年全解决方案

微服务架构已经成为现代软件开发的主流选择&#xff0c;其优势在于能够将复杂的系统拆分为独立的服务模块&#xff0c;方便开发和维护。然而&#xff0c;在微服务的实施过程中&#xff0c;开发者往往会面临许多挑战&#xff0c;如服务间通信、数据一致性、性能优化和故障处理等…...

Node.js 中的 Event 模块详解

Node.js 中的 Event 模块是实现事件驱动编程的核心模块。它基于观察者模式&#xff0c;允许对象&#xff08;称为“事件发射器”&#xff09;发布事件&#xff0c;而其他对象&#xff08;称为“事件监听器”&#xff09;可以订阅并响应这些事件。这种模式非常适合处理异步操作和…...

EasyRTC嵌入式WebRTC视频通话SDK支持Web浏览器、Linux、ARM、Android、iOS

随着互联网技术的飞速发展&#xff0c;实时通信&#xff08;RTC&#xff09;已经成为现代应用中不可或缺的一部分。无论是视频会议、在线教育、远程医疗&#xff0c;还是社交娱乐&#xff0c;实时通信技术都在其中扮演着重要角色。 然而&#xff0c;WebRTC技术在PC和移动端的支…...

pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网

首先pycharm官网是这一个。我是在2025年2月16日9:57进入的网站。如果网站还没有更新的话&#xff0c;那么就往下滑一下找到 community Edition,这个就是社区版了免费的。PyCharm&#xff1a;适用于数据科学和 Web 开发的 Python IDE 适用于数据科学和 Web 开发的 Python IDE&am…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...

接口 RESTful 中的超媒体:REST 架构的灵魂驱动

在 RESTful 架构中&#xff0c;** 超媒体&#xff08;Hypermedia&#xff09;** 是一个核心概念&#xff0c;它体现了 REST 的 “表述性状态转移&#xff08;Representational State Transfer&#xff09;” 的本质&#xff0c;也是区分 “真 RESTful API” 与 “伪 RESTful AP…...

【Redis】Redis从入门到实战:全面指南

Redis从入门到实战:全面指南 一、Redis简介 Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,它可以用作数据库、缓存和消息代理。由Salvatore Sanfilippo于2009年开发,因其高性能、丰富的数据结构和广泛的语言支持而广受欢迎。 Redis核心特点:…...

中国政务数据安全建设细化及市场需求分析

(基于新《政务数据共享条例》及相关法规) 一、引言 近年来,中国政府高度重视数字政府建设和数据要素市场化配置改革。《政务数据共享条例》(以下简称“《共享条例》”)的发布,与《中华人民共和国数据安全法》(以下简称“《数据安全法》”)、《中华人民共和国个人信息…...