算法专题:栈

目录

1. 删除字符串中的所有相邻重复项

1.1 算法原理

1.2 算法代码

2. 844. 比较含退格的字符串

2.1 算法原理

2.2 算法原理

3. 基本计算器 II

3.1 算法原理 

3.2 算法代码

4. 字符串解码 

 4.1 算法原理

 4.2 算法代码

5. 验证栈序列

5.1 算法原理

5.2 算法代码


1. 删除字符串中的所有相邻重复项

. - 力扣(LeetCode)

1.1 算法原理

解法: 使用栈模拟, 实现"消消乐"(使用字符串模拟栈)

满足以下任一条件入栈:

  1. 栈为空
  2. s[i]和栈顶元素不相同

满足以下条件出栈:

  1. s[i]和栈顶元素相同

1.2 算法代码

class Solution {public String removeDuplicates(String s) {// 字符串模拟栈结构StringBuilder stack = new StringBuilder();for(int i = 0; i < s.length(); i++) {char ch = s.charAt(i);int len = stack.length();// 栈为空 || ch 和栈顶元素不相同 => 入栈if(len == 0 || stack.charAt(len - 1) != ch) stack.append(ch);// ch 和栈顶元素相同 => 出栈else stack.deleteCharAt(len - 1);}return stack.toString();}
}

2. 844. 比较含退格的字符串

. - 力扣(LeetCode)

2.1 算法原理

本题思路与第一题相同, 

  1. 当 s[i] 为 '#' 时, 出栈
  2. 当 s[i] 不为 '#' 时, 入栈
  3. 最后比较经过退格处理后的两个字符串是否相同

2.2 算法原理

class Solution {public boolean backspaceCompare(String s, String t) {return strOpera(s).equals(strOpera(t));}public String strOpera(String s) {StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < s.length(); i++) {char ch = s.charAt(i);if (ch == '#') {// 出栈if(stringBuilder.length() >= 1) stringBuilder.deleteCharAt(stringBuilder.length() - 1);}else {// 入栈stringBuilder.append(ch);}}return stringBuilder.toString();}
}

3. 基本计算器 II

. - 力扣(LeetCode)

3.1 算法原理 

解法: 利用栈模拟运算过程

分类讨论:

1. s[i] 是运算符 => op = s[i] (记录运算符)

2. s[i] 是数字字符 , 把数字提取出来: tmp += s[i] - '0' (可能s[i + 1]仍为数字字符, 需循环处理)

  1. op == '+' => stack.push(tmp);
  2. op == '-' => stack.push(-tmp);
  3. op == '*' => stack.push(stack.pop() * tmp);
  4. op == '/' => stack.push(stack.pop() / tmp); 

3. 最终, 返回栈中所有元素的和 

注意:
需要处理空格字符!!

3.2 算法代码

class Solution {public int calculate(String ss) {char[] s = ss.toCharArray();int n = s.length;char op = '+';int tmp = 0;Stack<Integer> stack = new Stack<>();int i = 0;while(i < n) {if(s[i] == ' ') {i++;}else if(isOperator(s[i])) {op = s[i++];}else {tmp = s[i] - '0';while(i + 1 < n && !isOperator(s[i + 1]) && s[i + 1] != ' ') {tmp *= 10;tmp += s[i + 1] - '0';i++;}if(op == '+') stack.push(tmp);else if(op == '-') stack.push(-tmp);else if(op == '*') stack.push(stack.pop() * tmp);else stack.push(stack.pop() / tmp);i++;}}int ret = 0;for(int x : stack)  ret += x;return ret;}public boolean isOperator(char ch) {if(ch == '+' || ch == '-' || ch == '*' ||ch == '/') return true;return false;}
}

4. 字符串解码 

 . - 力扣(LeetCode)

 4.1 算法原理

解法: 栈模拟

  1. 遇见数字 => 放入"数字栈"
  2. 遇见 '[' => 将 '[' 后的字母字符串提取出来, 放入 "字符串栈"
  3. 遇见 ']' => 取 "字符串栈" 栈顶元素和 "数字栈" 栈顶元素进行解析,并拼接到 "字符串栈" 栈顶元素后
  4. 遇见单独的字符串 => 拼接到 "字符串栈" 栈顶元素后

 4.2 算法代码

class Solution {public String decodeString(String ss) {char[] s = ss.toCharArray();int n = s.length;Stack<Integer> intStack = new Stack<>();Stack<String> stringStack = new Stack<>();// 预处理 => 当栈为空时stringStack.push("");int i = 0;while(i < n) {if(s[i] > '0' && s[i] < '9') {int tmp = 0;while(i < n && s[i] >= '0' && s[i] <= '9') {tmp = tmp * 10 + (s[i++] - '0');}intStack.push(tmp);}else if(s[i] == '[') {i++;StringBuilder sb = new StringBuilder();while(i < n && s[i] >= 'a' && s[i] <= 'z') sb.append(s[i++]);stringStack.push(sb.toString());}else if(s[i] == ']') {StringBuilder sb = new StringBuilder();int x = intStack.pop();String str = stringStack.pop();while(x-- != 0) {sb.append(str);}stringStack.push(stringStack.pop() + sb.toString());i++;}else {StringBuilder sb = new StringBuilder();while(i < n && s[i] >= 'a' && s[i] <= 'z') sb.append(s[i++]);stringStack.push(stringStack.pop() + sb.toString());               }}return stringStack.pop();}
}

5. 验证栈序列

. - 力扣(LeetCode)

5.1 算法原理

解法: 使用 栈 模拟.

  • 一边进栈, 一边判断是否需要出栈.

对 pushed 中的元素进行进栈操作, 将栈顶元素和 popped[i] 比较, 若不相等则一直进栈, 若相等则出栈, 并判断是否需要循环出栈.

5.2 算法代码

class Solution {public boolean validateStackSequences(int[] pushed, int[] popped) {Stack<Integer> stack = new Stack<>();int i = 0, n = popped.length;for(int x : pushed) {stack.push(x);while(!stack.isEmpty() && stack.peek() == popped[i]) {stack.pop();i++;}}return i == n;}
}

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/464600.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZDH权限-扩展支持数据权限

目录 项目源码 预览地址 安装包下载地址 ZDH权限模块 ZDH权限扩展更细粒度方案 第一种方案&#xff1a; 第二种方案&#xff1a; ZDH权限扩展支持数据权限-新增属性 总结 感谢支持 项目源码 zdh_web: GitHub - zhaoyachao/zdh_web: 大数据采集,抽取平台 预览地址 后…

交换机的基本配置

交换机的基本配置 实验题目实验目的实验任务实验设备实验环境实验步骤VLAN 的简单配置跨交换机 vlan 的配置主机配置信息表解释&#xff1a; vlan 间路由 实验题目 交换机的基本配置。 实验目的 1) 理解交换机的原理和应用场景&#xff1b; 2) 交换机的基本指令系统&#xf…

借助 Aspose.Words,使用 C# 从 Word 文档中删除页面

如果您正在寻找一种快速删除 Word 文档中不相关、过时或空白页的方法&#xff0c;那么您来对地方了。在这篇博文中&#xff0c;我们将学习如何使用 C# 从 Word 文档中删除页面。我们将逐步引导您完成该过程&#xff0c;提供清晰的示例&#xff0c;以帮助您以编程方式高效地从 W…

华为 HarmonyOS NEXT 原生应用开发: 动画的基础使用(属性、显示、专场)动画

2024年11月5日 LiuJinTao 文章目录 鸿蒙中动画的使用一、属性动画 - animation属性动画代码示例 二、显示动画 - AnimateTo三、专场动画 鸿蒙中动画的使用 一、属性动画 - animation 属性动画代码示例 /*** 属性动画的演示*/ Entry Component struct Index {State selfWidth:…

基于STM32的手式电视机遥控器设计

引言 本项目基于STM32微控制器设计了一个手式电视机遥控器系统&#xff0c;通过集成加速度传感器和陀螺仪&#xff0c;实现手势识别和遥控功能。该遥控器系统可以通过简单的手势操作实现对电视机的音量调节、频道切换和开关机控制等功能。项目涉及到硬件设计、手势识别算法和红…

基于SpringBoot+微信小程序+协同过滤算法+二维码订单位置跟踪的农产品销售平台-新

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; “农产品商城”小程序…

论文阅读-用于点云分析的自组织网络

目前存在的问题&#xff1a; 原始的SOM&#xff08;1&#xff09;训练结果与初始节点高度相关&#xff08;2&#xff09;样本更新规则取决于输入点的顺序3D 卷积神经网络&#xff08;需要将数据转换为体素&#xff0c;存在分辨率损失和计算成本上涨的问题&#xff09;、PointN…

ComfyUI和Photoshop相结合,PS内实现:文生图,图生图,高清放大,局部重绘,面部修复,设计师福音

本文主要介绍&#xff1a;ComfyUI和Photoshop相结合&#xff0c;一个平台实现&#xff1a;图像生成&#xff0c;放大&#xff0c;局部重绘&#xff0c;面部修复&#xff0c;实时绘画 简直是设计师的福音。 主要包括&#xff1a; Photoshop 的安装以及插件的安装 Creative Cl…

新一代跟踪器StrongSORT: Make DeepSORT Great Again论文解析—让 DeepSORT 再次伟大

新一代跟踪器StrongSORT: Make DeepSORT Great Again论文解析—让 DeepSORT 再次伟大 时间&#xff1a;2023年 机构:北京邮电大学 发表在&#xff1a;IEEE TRANSACTIONS ON MULTIMEDIA, VOL. 25, 2023 代码源码地址&#xff1a; pytorch版本&#xff1a;https://github.com/dyh…

【力扣专题栏】重排链表,如何实现链表里面节点之间的交换?

题解目录 1、题目描述解释2、算法原理解析3、代码编写 1、题目描述解释 主要就是实现&#xff1a;第一个节点和最后一个节点交换&#xff0c;第二节点和倒数第二个节点交换&#xff0c;依次交换下去。 2、算法原理解析 3、代码编写 class Solution { public:void reorderList(…

TP-LINK TL-XDN7000H免驱版 ubuntu 20.04驱动安装

最近装机购买的主板没有无线网卡&#xff0c;PCIE网卡因为显卡占位无法安装&#xff0c;无奈只能购买USB无限网卡。 1 网卡型号 TP-LINK WiFi6免驱900M usb无线网卡 外置高增益 台式机笔记本电脑wifi接收器发射器 TL-XDN7000H 2 驱动下载链接 TL-XDN7000H免驱版 V1.1 Linu…

【初阶数据结构与算法】复杂度分析练习之轮转数组(多种方法)

文章目录 复杂度练习之轮转数组方法1方法2方法3 总结 复杂度练习之轮转数组 题目链接&#xff1a;https://leetcode.cn/problems/rotate-array/description/    为什么我们把这道题作为复杂度的练习题呢&#xff1f;是因为我们以后做题都会涉及到复杂度的计算&#xff0c;我…

H265编码丢帧问题分析

问题 通过海思芯片编码后,将编码的数据通过UDP网口发送到UDP 服务端,UDP服务端收到后保存成文件。 保存的文件有时候用VLC软件可以打开。有时候不能打开,同时用Elecard HEVC Analyer工具打开,发现VLC不能打开时丢帧。如下图,实际为858帧,而此处只有846帧。 分析 UDP包…

如何学习Java“高并发”,并在项目中实际应用?

高并发编程 提到并发编程很多人就会头疼了&#xff1b;首先就是一些基础概念&#xff1a;并发&#xff0c;并行&#xff0c;同步&#xff0c;异步&#xff0c;临界区&#xff0c;阻塞&#xff0c;非阻塞还有各种锁全都砸你脸上&#xff0c;随之而来的就是要保证程序运行时关键…

《TCP/IP网络编程》学习笔记 | Chapter 1:理解网络编程和套接字

《TCP/IP网络编程》学习笔记 | Chapter 1&#xff1a;理解网络编程和套接字 《TCP/IP网络编程》学习笔记 | Chapter 1&#xff1a;理解网络编程和套接字基本概念服务端客户端 基于 Linux 平台的 "Hello world!" 服务端和客户端基于 Linux 的文件操作打开文件关闭文件…

C#-类:声明类、声明类对象

一&#xff1a;类的声明 class 类名 {//特征——成员变量//行为——成员方法//保护特征——成员属性//构造函数和析构函数//索引器//运算符重载//静态成员 }类名&#xff1a;帕斯卡 同一个语句块中的不同类 不能重名 二&#xff1a;声明类对象 2.1 类的声明 ≠ 类对象的声…

qt QProgressBar详解

1、概述 QProgressBar是Qt框架中的一个控件&#xff0c;专门用于显示任务的进度。它提供了一个可视化的进度条&#xff0c;让用户能够直观地了解任务的完成程度。QProgressBar支持水平和垂直两种显示方向&#xff0c;并且可以通过设置最小值和最大值来指定进度条的范围。此外&…

Node.js 入门指南:从零开始构建全栈应用

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;node.js篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来node.js篇专栏内容:node.js-入门指南&#xff1a;从零开始构建全栈应用 前言 大家好&#xff0c;我是青山。作…

基于vue框架的的冷链食品物流信息管理系统v81wb(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,司机,冷链食品,冷链食品订单,冷链车辆,配送信息,订单费用,站点信息,食品种类,省,市,食品质量,县 开题报告内容 基于Vue框架的冷链食品物流信息管理系统开题报告 一、研究背景与意义 随着全球食品贸易的快速发展和消费者对食品品质…

使用GetX实现GetPage中间件

前言 GetX 中间件&#xff08;Middleware&#xff09;是 GetX 框架中的一种机制&#xff0c;用于在页面导航时对用户进行权限控制、数据预加载、页面访问条件设置等。通过使用中间件&#xff0c;可以有效地控制用户的访问流程&#xff0c;并在适当条件下引导用户到所需页面。 这…