优选算法的后进之道:栈专题

专栏:算法的魔法世界

个人主页:手握风云

一、例题讲解

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

这道题要求针对仅由小写英文字母组成的字符串 s,反复执行相邻重复项删除操作,该操作的规则为每次选取字符串中两个相邻且相同的字母并将其删除,需持续进行此删除操作直至字符串中不存在可继续删除的相邻重复字母,最终返回完成所有删除操作后的唯一结果字符串。

我们可以按照消消乐的游戏规则,当遇到相邻相同的字符时,直接删除,然后上面的元素会往下落。接下来我们用容器来模拟一下:遍历字符串,如果容器不为空,且顶部元素与当前元素不一样,就丢进容器中,如果相同,则将顶部元素移除。这时我们很明显就发现这个过程符合栈的特性,但其实我们不用新建一个栈,我们直接使用 StringBuilder 的 append 和 deleteCharAt 方法模拟入栈和出栈的过程。

完整代码实现:

java 复制代码
class Solution {
    public String removeDuplicates(String s) {
        StringBuilder builder = new StringBuilder();

        for (char ch : s.toCharArray()) {
            if (builder.length() != 0 && ch == builder.charAt(builder.length() - 1)) {
                builder.deleteCharAt(builder.length() - 1);
            } else {
                builder.append(ch);
            }
        }

        return builder.toString();
    }
}

1.2. 比较含退格的字符串

本题要求比较两个由小写字母和退格字符#组成的字符串s与t,其中#代表退格操作,若对空文本执行退格,文本仍保持为空。需要将两个字符串分别输入空白文本编辑器,按照退格规则完成字符处理后,判断最终得到的结果是否完全相同,若相同则返回布尔值true,不相同则返回false。

本题遇上一题类似,依然遍历字符串,如果是字母,则放入栈中,如果栈不为空且当前字符是 # 时,则将栈顶元素弹出。

完整代码实现:

java 复制代码
class Solution {
    public boolean backspaceCompare(String s, String t) {
        StringBuilder builderS = new StringBuilder();
        StringBuilder builderT = new StringBuilder();

        for (char ch : s.toCharArray()) {
            if (ch >= 'a' && ch <= 'z') {
                builderS.append(ch);
            } else if (builderS.length() != 0 && ch == '#') {
                builderS.deleteCharAt(builderS.length() - 1);
            }
        }

        for (char ch : t.toCharArray()) {
            if (ch >= 'a' && ch <= 'z') {
                builderT.append(ch);
            } else if (builderT.length() != 0 && ch == '#') {
                builderT.deleteCharAt(builderT.length() - 1);
            }
        }

        return builderS.toString().equals(builderT.toString());
    }
}

1.3. 基本计算器 II

本题要求实现一个基本计算器,对给定的由非负整数、+、-、*、/运算符以及空格组成的有效字符串表达式s进行计算并返回结果,其中整数除法仅保留整数部分;解题时不允许使用eval()等直接将字符串作为数学表达式计算的内置函数,题目保证表达式始终合法,所有中间计算结果与最终答案均在 32 位有符号整数范围内,无需处理括号,只需按照四则运算的优先级完成计算即可。

完整代码实现:

java 复制代码
class Solution {
    public int calculate(String s) {
        Stack<Integer> stack = new Stack<>();
        char op = '+';
        int n = s.length(), i = 0, ret = 0;
        char[] chs = s.toCharArray();

        while (i < n) {
            if (chs[i] == ' ') {
                i++;
            } else if (chs[i] >= '0' && chs[i] <= '9') {
                int tmp = 0;
                while (i < n && chs[i] >= '0' && chs[i] <= '9') {
                    tmp = tmp * 10 + (chs[i] - '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);
                }
            } else {
                op = chs[i];
                i++;
            }
        }

        for (int j : stack) {
            ret += j;
        }

        return ret;
    }
}
相关推荐
搞科研的小刘选手6 分钟前
【大连市计算机学会主办】第三届图像处理、智能控制与计算机工程国际学术会议(IPICE 2026)
图像处理·人工智能·深度学习·算法·计算机·数据挖掘·智能控制
人月神话-Lee8 分钟前
【图像处理】高斯模糊——最优雅的模糊算法
图像处理·人工智能·算法·ios·ai编程·swift
大熊背20 分钟前
双目拼接竖缝消除(ISP 分区锐化实操方案) 优化方案
人工智能·算法·双目拼接
_日拱一卒23 分钟前
LeetCode:105从前序与中序遍历序列构造二叉树
算法·leetcode·职场和发展
MicroTech202524 分钟前
微算法科技(NASDAQ :MLGO)发布基于NEQR技术的新型量子视频处理算法,重构智能视觉底层逻辑
科技·算法·音视频
techdashen26 分钟前
Async Rust 近况补课:从 `async-trait` 到原生 async trait
网络·算法·rust
一行代码一行诗++28 分钟前
循环的嵌套
数据结构·算法
玖釉-36 分钟前
C++ 中的矩阵介绍:以二维矩阵查找为例
c++·windows·算法·矩阵
ECT-OS-JiuHuaShan37 分钟前
存在是微分张量积,标量是参数但不可能是本质。还原论泛化,是语义劫持和以偏概全的逻辑谋杀伪科学庞氏骗局
数据库·人工智能·算法·机器学习·数学建模
CQU_JIAKE40 分钟前
5.22【A】
算法