算法——栈

在这里插入图片描述

T04BF

👋专栏: 算法|JAVA|MySQL|C语言

🫵 小比特 大梦想

此篇文章与大家分享关于栈相关的算法
如果有不足的或者错误的请您指出!

目录

  • 1.删除字符中的所有相邻重复项
    • 1.1解析
    • 1.2题解
  • 2.比较含退格的字符串
    • 2.1解析
    • 2.2题解
  • 3.基本计算器II
    • 3.1解析
    • 3.2题解
  • 4.字符串解码
    • 4.1解析
    • 4.2题解
  • 5.验证栈序列
    • 5.1解析
    • 5.2题解

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

题目:删除字符中所有重复项

1.1解析

我们在遍历给定字符串的时候,当前这个元素是否要删除,是由它的前一个元素决定的,如果前一个元素和它相同,那么就删除,反之不删除
而栈的"后进先出"特性就恰好能够满足这类特性
即我们在遍历字符串的时候,判断当前这个元素是不是和栈顶元素相同,如果一样就取出栈顶元素,不一样就把这个元素放到栈里面
但是如果我们真的创建了栈,到时候还需要把字符一个个从栈里面拿出来
不如直接用字符串来模拟栈,直接在字符串上面进行拼接和删除操作

1.2题解

class Solution {
    public String removeDuplicates(String ss) {
        StringBuffer ret = new StringBuffer();
        char[] s = ss.toCharArray();
        for(char ch : s){
            if(ret.length() != 0 && ch == ret.charAt(ret.length()-1)){
                ret.deleteCharAt(ret.length()-1);
            }else {
                ret.append(ch);
            }
        }
        return ret.toString();
    }
}

2.比较含退格的字符串

题目:比较含退格的字符串

2.1解析

因为"退格"需要知道前一个元素的信息,因此也满足栈"后进先出"的特性
因此我们遍历字符串的时候,如果是字符,就直接放入栈里,如果是’#’,就删除栈顶元素
还是和上一道题一样,我们用字符串来模拟栈

2.2题解

class Solution {
    public static boolean backspaceCompare(String s, String t) {
        return backspace(s).equals(backspace(t));
    }
    private static String backspace(String ss){
        char[] s = ss.toCharArray();
        int n = s.length;
        StringBuffer ret = new StringBuffer();
        for(char ch : s){
            if(ch == '#'){
                if(ret.length() > 0){
                    ret.deleteCharAt(ret.length()-1);
                }
            }else{
                ret.append(ch);
            }
        }
        return ret.toString();
    }  
}

3.基本计算器II

题目:基本计算器II

3.1解析

这道题相比(基本计算器I)来说比较简单,因为不涉及括号
我们遍历题目给定字符串,由于 * / 的优先级是大于 + -的,因此我们遍历数字的时候就会出现4种情况
如果数字前面的字符是’+’,那么这一个数是否现在该被计算是不确定的,因此就要将这个数放入栈中
如果这个数字前面的符号是’-’,那么这一个数是否现在该被计算也是不确定的,因此就要将这个数的相反数放入栈中
如果这个数前面的符号是’*’,那么由于优先级最高,就可以将栈顶元素与这个数相乘,得到的结果在放进栈中
如果这个数前面的符号是’ / ',那么由于优先级最高,就可以将栈顶元素除以这个数,得到的结果在放进栈中
遍历完数组后,再将栈中的元素相加即可得到答案

这样,就能模拟出计算的过程

关于基本计算器I以及其拓展在我的个人主页前缀表达式转中缀表达式有提及

3.2题解

class Solution {
    public int calculate(String ss) {
        char[] s = ss.toCharArray();
        int n = s.length;
        char op = '+';
        int i = 0;
        Stack<Integer> stack = new Stack<>();
        while(i < n){
            char ch = s[i];
            if(ch == ' '){
                i++;
            }else if(Character.isDigit(ch)){
                int tmp = 0;
                while(i < n && Character.isDigit(s[i])){
                    tmp = tmp * 10 + (s[i++] - '0');
                }
                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);
                }
            }else{
                op = ch;
                i++;
            }
        }
        int ret = 0;
        while(!stack.isEmpty()){
            ret += stack.pop();
        }
        return ret;
    }
}

4.字符串解码

题目:字符串解码

4.1解析

这道题我们在遍历字符串的时候要注意两个信息
(1)’['之前的数字
(2)[]之间的字符串
因此我们要搞两个栈来存储这两个信息
我们用一个包含所有的可能例子来解释
在这里插入图片描述
我们用i来遍历字符串

当我们遇到数字的时候,就直接将数字放在栈里面
在这里插入图片描述

遇到’[‘的时候,就将’[‘后面的字符串放进栈里
在这里插入图片描述
接下来还是数字和[:
在这里插入图片描述
当遇到’]'的时候,此时就要将字符串栈顶的字符串复制n遍,n是数字栈顶的数字
在这里插入图片描述
注意此时不是将复制完后的字符串放到栈里面去,而是将得到的字符串与栈顶字符串进行拼接
在这里插入图片描述

再次遇到],就按照我们上面的复制拼接操作,但是此时拿出字符串后,栈里面为空,复制完拼接的时候就会抛出栈为空的异常,我们可以直接在栈底放一个空字符串,将复制完后的结果直接拼接在空字符串后面即可
在这里插入图片描述

当直接遇到字符的时候,说明此时是单独的字符串,直接拼接即可
在这里插入图片描述
再次遇到数字和[,按照我们上面操作即可

4.2题解

class Solution {
     public static String decodeString(String ss) {
        Stack<String> stack1 = new Stack<>();
        stack1.add("");
        Stack<Integer> stack2 = new Stack<>();
        char[] s = ss.toCharArray();
        int i = 0;
        int n = s.length;
        while(i < n){
            char ch = s[i];
            if(Character.isDigit(ch)){
                int tmp = 0;
                while(i < n && Character.isDigit(s[i])){
                    tmp = tmp * 10 + (s[i++] - '0');
                }
                stack2.add(tmp);
            } else if (ch == '[') {
                i++;
                StringBuffer tmp = new StringBuffer();
                while (i < n && Character.isLowerCase(s[i])){
                    tmp.append(s[i++]);
                }
                stack1.add(tmp.toString());
            } else if (ch == ']') {
                int num = stack2.pop();
                String str  = stack1.pop();
                StringBuffer tmp = new StringBuffer(stack1.pop());

                while (num-- > 0){
                    tmp.append(str);
                }
                stack1.add(tmp.toString());
                i++;
            } else {
                StringBuffer tmp = new StringBuffer();
                while (i < n && Character.isLowerCase(s[i])){
                    tmp.append(s[i++]);
                }
                StringBuffer str = new StringBuffer(stack1.pop());
                str.append(tmp);
                stack1.add(str.toString());
            }
        }
        return stack1.pop();
    }
}

5.验证栈序列

题目:验证栈序列

5.1解析

思路比较简单,我们只需要自己模拟入栈的过程,每次入栈后都判断入栈元素与出栈元素是否相等,相等则出栈
等到入栈完后,判断出栈数组是否遍历完即可

5.2题解

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        int i = 0;
        Stack<Integer> stack = new Stack<>();
        for(int x : pushed){
            stack.push(x);
            while(!stack.isEmpty() && popped[i] == stack.peek()){
                i++;
                stack.pop();
            }
        }
        return i == popped.length;
    }
}
感谢您的访问!!期待您的关注!!!

在这里插入图片描述

T04BF

🫵 小比特 大梦想

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

清明美食制作|“心灵护航,增能培力”残疾人职业能力提升培养

为提高残疾人的动手能力&#xff0c;提升个人的自身素质和自主就业创业能力&#xff0c;弘扬中华民族传统文化&#xff0c;临近清明之际&#xff0c;淳安县从益舍社会工作服务中心于浪川乡展开了以“品尝春天味道 制作清明粿 清明美食制作”为主题的清明节活动。 【清明粿制作】…

【C语言__函数__复习篇1】

目录 前言&#xff1a; 一、C语言中函数的概念 二、库函数 2.1 库函数的概念 2.2 怎样自学库函数——以sqrt函数为例 三、自定义函数 3.1 自定义函数的概念 3.2 自定义函数的语法形式 3.3 函数的实参 3.4 函数的形参 3.5 实参与形参的关系 3.6 return语句 3.7 数组传参 …

O2OA开发平台如何查看数据表结构?

在访问后端api地址&#xff0c;页面最下方有列示平台的各个服务&#xff0c;点击进入可查看具体的表内容 后端api地址&#xff1a; http://{hostIP}/x_program_center/jest/list.html 其中&#xff1a;{hostIP}为中心服务器所在域名或者IP地址 如下图&#xff1a;

RA4000CE为汽车动力传动系统提供解决方案

目前汽车电气化的水平越来越高&#xff0c;其中比较显著的一个发展方向就是将发动机管理系统和自动变速器控制系统&#xff0c;集成为动力传动系统的综合控制(PCM)。作为汽车动力的核心部件&#xff0c;通过电子系统的运用&#xff0c;将外部多个传感器和执行环节的数据进行统一…

Go 自定义14位时间类型 yyyyMMddHHmmss

目录 功能 代码 功能 数据库或者接口时间类型&#xff0c;经常会使用14位的时间格式。每次都转换有点麻烦。可以自定义一个时间类型。 自定义类型需要实现json接口中的MarshalJSON与UnmarshalJSON两个函数&#xff0c;这样在做json编码解码时就会自动转为14位的时间格式了。…

基于flutter3.x+window_manager+getx桌面端仿macOS系统

flutter3_macui桌面端仿macOS系统实战项目完结啦&#xff01; 原创研发flutter3.19dart3.3window_managergetx等技术构建桌面版macOS系统。支持自定义毛玻璃虚化背景、Dock菜单多级嵌套自由拖拽排序、可拖拽弹窗等功能。 支持macOS和windows11两种风格。 使用技术 编辑器&…

【c++】优先级队列|反向迭代器(vector|list)

优先级队列的常用函数的使用 #include<iostream> #include<queue> using namespace std;int main() {priority_queue<int>st;st.push(1);st.push(7);st.push(5);st.push(2);st.push(3);st.push(9);while (!st.empty()){cout << st.top() << &qu…

【vue】watch 侦听器

watch&#xff1a;可监听值的变化&#xff0c;旧值和新值 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

openstack之neutron介绍

核心组件 neutron-server&#xff1a;提供API接口&#xff0c;把对应的api请求传给plugin进&#xff1b; neutron-plugin&#xff1a;管理逻辑网络状态&#xff0c;调用agent&#xff1b; neutron-agent&#xff1a;在provider network上创建网络对象&#xff1b; neutron-…

【Vue】实现仿微信输入@出现选择框

<div style"padding: 10px 10px" class"editor"><el-inputresizetype"textarea":rows"4"clearableplaceholder"请输入您的问题.."v-model"requestParams.prompt"input"handleInput"keydown.na…

C# WinForm —— 项目目录结构

1. WinForm 应用程序项目 Properties&#xff1a;属性文件夹存放了一个自动生成的类文件AssemblyInfo.cs&#xff0c;保存了一些应用程序集的一些信息引用存放了一些为应用程序提供所需的&#xff0c;某些功能的一些程序集&#xff08;dll文件&#xff09;等添加引用&#xff…

Html网页小游戏源代码

Html网页小游戏源代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Jello Jumping Game</title><meta name"viewport" content"widthdevice-width, initial-scale1"&…

【安全】挖矿木马自助清理手册

一、什么是挖矿木马 挖矿木马会占用CPU进行超频运算&#xff0c;从而占用主机大量的CPU资源&#xff0c;严重影响服务器上的其他应用的正常运行。黑客为了得到更多的算力资源&#xff0c;一般都会对全网进行无差别扫描&#xff0c;同时利用SSH爆破和漏洞利用等手段攻击主机。 …

【AR】使用深度API实现虚实遮挡

遮挡效果 本段描述摘自 https://developers.google.cn/ar/develop/depth 遮挡是深度API的应用之一。 遮挡&#xff08;即准确渲染虚拟物体在现实物体后面&#xff09;对于沉浸式 AR 体验至关重要。 参考下图&#xff0c;假设场景中有一个Andy&#xff0c;用户可能需要放置在包含…

2024年蓝桥杯40天打卡总结

2024蓝桥杯40天打卡总结 真题题解其它预估考点重点复习考点时间复杂度前缀和二分的两个模板字符串相关 String和StringBuilderArrayList HashSet HashMap相关蓝桥杯Java常用算法大数类BigInteger的存储与运算日期相关考点及函数质数最小公倍数和最大公约数排序库的使用栈Math类…

牛客周赛 Round 39(A,B,C,D,E,F,G)

比赛链接 官方题解&#xff08;视频&#xff09; B题是个贪心。CD用同余最短路&#xff0c;预处理的完全背包&#xff0c;多重背包都能做&#xff0c;比较典型。E是个诈骗&#xff0c;暴力就完事了。F是个线段树。G是个分类大讨论&#xff0c;出题人钦定的本年度最佳最粪 题目…

14届蓝桥杯 C/C++ B组 T6 岛屿个数 (BFS,FloodFill,填色)

首先拿到这道题不要想着去直接判断环里面的岛屿&#xff0c;这样太困难了&#xff0c;我们可以使用之前做过的题的经验&#xff0c;在输入加入一圈海水&#xff0c;然后从(0,0)点开始BFS&#xff0c;这里进行八向搜索&#xff0c;搜到的0全部都染色成2&#xff0c;假如2能够蔓延…

GD32 HID键盘矩阵键盘发送数据时,一直发送数据问题处理

这个问题找了两三天,开始并不认为是示例程序的问题,只是感觉是自己代码问题。 这个解决流程大概是: 先调好矩阵键盘=> 调用发送函数。 就是因为调用时,一直发送数据,我也在按键抬起做了操作,始终不行。 最后,发现时示例代码中有个 空闲中断 引起的。 udev->reg…

数学建模-最优包衣厚度终点判别法-三(Bayes判别分析法和梯度下降算法)

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是viperrrrrrr~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff…

【算法】bfs解决FloodFill问题

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 FloodFill算法1. 733. 图像渲染1.1 分析1.2 代码 2. 200. 岛屿数量2.1 分析2.2 代码 3. 695. 岛屿的最大面积3.1 分析3.2 代码 4. 130. 被围绕的区域4.1 分析4.2 代码 FloodFill算法 FloodFill就是洪水灌溉&#xff0c;解…