算法奇妙屋(九)-栈

⚙️个人专栏:

《Java算法时空: 图解手撕原理》 《 多线程 》 《JavaSE基础原理 》 《数据结构》

✨与其内耗自己,不如责备他人

目录

[一. 力扣 1047. 删除字符串中的所有相邻重复项](#一. 力扣 1047. 删除字符串中的所有相邻重复项)

[1. 题目](#1. 题目)

[2. 算法原理](#2. 算法原理)

[3. 代码](#3. 代码)

[二. 力扣 844. 比较含退格的字符串](#二. 力扣 844. 比较含退格的字符串)

[1. 题目](#1. 题目)

[2. 算法原理](#2. 算法原理)

[3. 代码](#3. 代码)

[三. 力扣 227. 基本计算器 II](#三. 力扣 227. 基本计算器 II)

[1. 题目](#1. 题目)

[2. 算法原理](#2. 算法原理)

[3. 代码](#3. 代码)

[四. 力扣 394. 字符串解码](#四. 力扣 394. 字符串解码)

[1. 题目](#1. 题目)

[2. 算法原理](#2. 算法原理)

[3. 代码](#3. 代码)

[五. 力扣 946. 验证栈序列](#五. 力扣 946. 验证栈序列)

[1. 题目](#1. 题目)

[2. 算法原理](#2. 算法原理)

[3. 代码](#3. 代码)


一. 力扣 1047. 删除字符串中的所有相邻重复项

1. 题目

题目的意思不难理解,删除相同元素,有点像开心消消乐

2. 算法原理

3. 代码

java 复制代码
    public String removeDuplicates(String s) {
        StringBuilder stringBuilder = new StringBuilder();
        int cur = -1;
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (cur != -1) {
                char c = stringBuilder.charAt(cur);
                if (ch == c) {
                    stringBuilder.deleteCharAt(cur);
                    cur--;
                }else {
                    stringBuilder.append(ch);
                    cur++;
                }
            }else {
                stringBuilder.append(ch);
                cur++;
            }
        }
        return stringBuilder.toString();
    }

二. 力扣 844. 比较含退格的字符串

1. 题目

2. 算法原理

与上面那道题原理一致,这里不过多赘述,需要注意,如果对空文本输入退格字符,文本继续为空,意味着可能#比有效字符多

3. 代码

java 复制代码
    public boolean backspaceCompare(String s, String t) {
        StringBuilder tmp1 = new StringBuilder();
        StringBuilder tmp2 = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (tmp1.length() != 0 && ch == '#') {
                tmp1.deleteCharAt(tmp1.length() - 1);
            }else {
                if (ch != '#') {
                    tmp1.append(ch);
                }
            }
        }
        for (int i = 0; i < t.length(); i++) {
            char ch = t.charAt(i);
            if (tmp2.length() != 0 && ch == '#') {
                tmp2.deleteCharAt(tmp2.length() - 1);
            }else {
                if (ch != '#') {
                    tmp2.append(ch);
                }
            }
        }
        return tmp1.toString().equals(tmp2.toString());
    }

三. 力扣 227. 基本计算器 II

1. 题目

遇到计算求值类型的题目, 别犹豫, 直接上栈

2. 算法原理

3. 代码

java 复制代码
    public int calculate(String s) {
        Stack<Integer> stack = new Stack<Integer>();
        char op = '+';
        int i = 0;
        int n = s.length();
        while (i < n) {
            char ch = s.charAt(i);
            if (ch == ' ') {
                i++;
            }else if (ch >= '0' && ch <= '9') {
                int tmp = 0;
                while (i < n && ch >= '0' && ch <= '9') {
                    tmp = tmp * 10 + (ch - '0');
                    i++;
                    if (i < n) {
                        ch = s.charAt(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 = ch;
                i++;
            }
        }
        int sum = 0;
        while (!stack.isEmpty()) {
            sum += stack.pop();
        }
        return sum;
    }

四. 力扣 394. 字符串解码

1. 题目

类似于加括号的计算器运算, 这里也是先计算括号里面的, 但不同的是括号中的是字母,我们要根据括号外面的数字字符,来进行对应次数的复制

2. 算法原理

3. 代码

java 复制代码
    public String decodeString(String s) {
        Stack<String> zs = new Stack<>();
        Stack<Integer> zi = new Stack<>();
        zs.push("");
        int i = 0;
        int n = s.length();
        char[] c = s.toCharArray();
        while (i < n) {
            if (c[i] >= '0' && c[i] <= '9' ) {
                int num = 0;
                while (i < n && c[i] >= '0' && c[i] <= '9') {
                    num = num * 10 + (c[i] - '0');
                    i++;
                }
                zi.push(num);
            }else if (c[i] == '[') {
                i++;
                StringBuilder stringBuilder = new StringBuilder();
                while (i < n && c[i] >= 'a' && c[i] <= 'z') {
                    stringBuilder.append(c[i]);
                    i++;
                }
                zs.push(stringBuilder.toString());
            }else if (c[i] == ']') {
                int j = zi.pop();
                String tmp = zs.pop();
                StringBuilder ret = new StringBuilder();
                while (j > 0) {
                    ret.append(tmp);
                    j--;
                }
                i++;
                String concat = zs.pop().concat(ret.toString());
                zs.push(concat);
            }else {
                StringBuilder stringBuilder = new StringBuilder();
                while (i < n && c[i] >= 'a' && c[i] <= 'z') {
                    stringBuilder.append(c[i]);
                    i++;
                }
                String concat =  zs.pop().concat(stringBuilder.toString());
                zs.push(concat);
            }
        }
        return zs.pop();
    }

五. 力扣 946. 验证栈序列

1. 题目

这道题是学习栈这个数据结构的经典题, 判断栈的出栈序列是否正确, 既然是判断栈的出栈,那么与栈这个数据结构也是脱离不了干系的

2. 算法原理

3. 代码

java 复制代码
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Stack<Integer> stack = new Stack<>();
        int j = 0;
        for (int i = 0; i < pushed.length; i++) {
            stack.push(pushed[i]);
            while (!stack.isEmpty() && stack.peek() == popped[j]) {
                stack.pop();
                j++;
            }
        }
        return stack.isEmpty();
    }
相关推荐
shepherd1117 小时前
破局延时任务(下):Spring Boot + DelayQueue 优雅实现分布式延时队列(实战篇)
java·spring boot·后端
听风吟丶7 小时前
深入解析 Spring Boot 自动配置:原理、实践与进阶
java·数据库·sql
lang201509287 小时前
Spring Boot 核心技巧与实战指南
java·数据库·spring boot
CoovallyAIHub7 小时前
未来已来:从 CVPR & ICCV 观察 2025→2026 年计算机视觉的七大走向
深度学习·算法·计算机视觉
SimonKing7 小时前
Spring Boot还能这样玩?同时监听多个端口的黑科技
java·后端·程序员
日月星辰Ace7 小时前
JDK 工具学习系列(三):javadoc 命令实用教程
java
apcipot_rain7 小时前
CSP集训错题集 第八周 主题:基础图论
算法·图论
天选之女wow7 小时前
【代码随想录算法训练营——Day57(Day56周日休息)】图论——53.寻宝
算法·图论
亚林瓜子7 小时前
SpringBoot中使用tess4j进行OCR(在macos上面开发)
java·spring boot·macos·ocr·lstm·tess4j