leetcode 栈部分笔记

leetcode 栈部分笔记

  • [1. 有效的括号](#1. 有效的括号)
  • [2. 简化路径](#2. 简化路径)
  • [3. 逆波兰表达式求值](#3. 逆波兰表达式求值)

1. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

每个右括号都有一个对应的相同类型的左括号。


解题思路: 用栈存储左括号,如果遇到右括号,则先判断栈是否为空,如果为空则false,如果不为空,则弹栈判断是否匹配,如果不匹配则false。

csharp 复制代码
class Solution {
    public boolean isValid(String s) {
        char[] chars = s.toCharArray();
        Stack<Character> stack = new Stack<Character>();
        for (char c : chars){
            if (c == '('||c == '['||c == '{'){
                stack.push(c);
            }
            if (c == ')'){
                if (stack.isEmpty()){
                    return false;
                }
                if (!stack.pop().equals('(')) {
                    return false;
                }
            }
            if (c == ']'){
                if (stack.isEmpty()){
                    return false;
                }
                if (!stack.pop().equals('[')) {
                    return false;
                }
            }
            if (c == '}'){
                if (stack.isEmpty()){
                    return false;
                }
                if (!stack.pop().equals('{')) {
                    return false;
                }
            }
        }
        if (!stack.isEmpty()){
            return false;
        }else {
            return true;
        }
    }
}

2. 简化路径

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为 更加简洁的规范路径。

在 Unix 风格的文件系统中规则如下:

一个点 '.' 表示当前目录本身。

此外,两个点 '...' 表示将目录切换到上一级(指向父目录)。

任意多个连续的斜杠(即,'//' 或 '///')都被视为单个斜杠 '/'。

任何其他格式的点(例如,'...' 或 '...')均被视为有效的文件/目录名称。

返回的 简化路径 必须遵循下述格式:

始终以斜杠 '/' 开头。

两个目录名之间必须只有一个斜杠 '/' 。

最后一个目录名(如果存在)不能 以 '/' 结尾。

此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '...')。

返回简化后得到的 规范路径 。

解题思路: 首先用/分割所有字符串,对字符串数组进行遍历,如果是...,则返回上一级目录,也就是栈内最后一个元素弹出。如果不是点并且是个字符串,则放入栈中。如果stack不为空,则进行路径构造,也就是用/构造,再弹出第一个元素如此构造。

csharp 复制代码
class Solution {
    public String simplifyPath(String path) {
        StringBuilder s = new StringBuilder();
        String[] sp = path.split("/");
        Deque<String> stack = new LinkedList<String>();
        for (String p : sp){
            if ("..".equals(p)){
                if (!stack.isEmpty()){
                    stack.pollLast();
                }
            }else if (p.length()>0&&!".".equals(p)){
                stack.offerLast(p);
            }
        }
        if (stack.isEmpty()){
            s.append('/');
        }else {
            while (!stack.isEmpty()){
                s.append('/');
                s.append(stack.pollFirst());
            }
        }
        return s.toString();
    }
}

3. 逆波兰表达式求值

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

有效的算符为 '+'、'-'、'*' 和 '/' 。

每个操作数(运算对象)都可以是一个整数或者另一个表达式。

两个整数之间的除法总是 向零截断 。

表达式中不含除零运算。

输入是一个根据逆波兰表示法表示的算术表达式。

答案及所有中间计算结果可以用 32 位 整数表示。

解题思路: 首先定义计算逻辑。用栈解决,首先遍历整个字符串数组,判断是否为操作符,如果是操作符,则需要进行计算,先把栈中两个元素弹出,计算后,并把计算结果存入栈中。如果不是运算符,则直接把该字符串存入栈中。

注意:字符串转整数 Integer.parseInt()。

csharp 复制代码
class Solution {
    public int caculate(int a, int b, char c) {
        int res = 0;
        switch (c) {
            case '+': res = a + b; break;
            case '-': res = a - b; break;
            case '*': res = a * b; break;
            case '/': res = a / b; break;
        }
        return res;
    }

    public int evalRPN(String[] tokens) {
        Deque<Integer> stack = new LinkedList<>();
        for (String token : tokens) {
            // 判断是否是操作符
            if ("+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token)) {
                int b = stack.pollLast();
                int a = stack.pollLast();
                stack.offerLast(caculate(a, b, token.charAt(0)));
            } else {
                // 将数字字符串转换为整数并入栈
                stack.offerLast(Integer.parseInt(token));
            }
        }
        return stack.pollLast();
    }
}
相关推荐
伤不起bb2 小时前
MySQL 高可用
linux·运维·数据库·mysql·安全·高可用
tmacfrank5 小时前
网络编程中的直接内存与零拷贝
java·linux·网络
向上的车轮6 小时前
MATLAB学习笔记(七):MATLAB建模城市的雨季防洪排污的问题
笔记·学习·matlab
躺着听Jay7 小时前
Oracle-相关笔记
数据库·笔记·oracle
田梓燊7 小时前
数学复习笔记 19
笔记·线性代数·机器学习
QQ2740287567 小时前
Soundness Gitpod 部署教程
linux·运维·服务器·前端·chrome·web3
qwfys2007 小时前
How to configure Linux mint desktop
linux·desktop·configure·mint
南方以南_7 小时前
Ubuntu操作合集
linux·运维·ubuntu
逼子格7 小时前
硬件工程师笔记——二极管Multisim电路仿真实验汇总
笔记·嵌入式硬件·硬件工程师·multisim·硬件工程师学习·电子器件·电路图
龙湾开发8 小时前
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 10.增强表面细节(二)法线贴图
c++·笔记·学习·图形渲染·贴图