代码随想录算法训练营第十一天 | 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

文章介绍了使用栈解决LeetCode上的三个问题:有效括号检查,删除字符串中的相邻重复项,以及逆波兰表达式求值。通过栈的特性,分别处理括号匹配、消除相邻重复字符和计算表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode 20. 有效的括号

题目链接:力扣

思路: 根据对题目的理解,核心就在于括号对的匹配,遇到左括号就需要入栈,遇到右括号就需要对比栈顶元素是否能够与括号对匹配成功,若成功则可消除,否则保留。在判断的过程中,一旦发现括号对不匹配的情况则可以提前结束判断。

最后需要注意的点在于,即使所有的括号对都能匹配成功,但也还是存在,入栈元素未全部消除的情况,这时候需要判断栈内元素的数量,不等于零则表示无效的括号,否则表示有效。

代码:

class Solution {
    public boolean isValid(String s) {
        Map<Character, Character> map = new HashMap<>();
        Stack<Character> stack = new Stack<>();
        map.put('}', '{');
        map.put(')', '(');
        map.put(']', '[');
        for (char ch: s.toCharArray()) {
            if (map.containsValue(ch)) { // 左括号都入栈 ({[
                stack.push(ch);
            } else {
                if (stack.size() == 0 || map.get(ch) != stack.pop()) {
                    return false;
                }
            }
        }

        return stack.size() == 0;
    }
}

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

题目链接:力扣

思路:消除相邻重复项使用栈来解决是最合适的场景,一旦发现当前元素与已经入栈的栈顶元素相同则直接出栈表示消除即可,然后继续遍历后续元素执行同样的操作,最后得到消除的结果。

代码:

class Solution {
    public String removeDuplicates(String s) {
        Stack<Character> stack = new Stack<>();
        for (char ch: s.toCharArray()) {
            if (stack.size() == 0) {
                stack.push(ch);
            } else {
                if (stack.peek() == ch) {
                    stack.pop();
                } else {
                    stack.push(ch);
                }
            }
        }

        StringBuilder sb = new StringBuilder();
        while (stack.size() > 0) {
            sb.append(stack.pop());
        }

        return sb.reverse().toString();
    }
}

 LeetCode 150. 逆波兰表达式求值

题目链接:力扣

思路: 利用逆波兰表达式元素和运算符的结合关系,也就是当前元素若是运算符之一则需要pop两次栈元素,然后将计算结果入栈,重复此操作直到所有元素都计算完成得到最后的运算结果。

代码:

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<String> stack = new Stack<>();
        List<String> list = new ArrayList<>();
        list.add("+");
        list.add("-");
        list.add("*");
        list.add("/");
        for (String str: tokens) {
            if (!list.contains(str)) {
                stack.push(str);
            } else {
                String pop1 = stack.pop();
                String pop2 = stack.pop();
                switch (str) {
                    case "+" -> stack.push(String.valueOf(Integer.parseInt(pop1) + Integer.parseInt(pop2)));
                    case "-" -> stack.push(String.valueOf(Integer.parseInt(pop2) - Integer.parseInt(pop1)));
                    case "*" -> stack.push(String.valueOf(Integer.parseInt(pop1) * Integer.parseInt(pop2)));
                    default -> stack.push(String.valueOf(Integer.parseInt(pop2) / Integer.parseInt(pop1)));
                }
            }
        }
        return Integer.parseInt(stack.pop());
    }
}

### 使用 Python 实现态地可视化的库 对于希望创建态地可视化的开发者来说,Python 提供了多个强大的工具。其中最常用的几个库包括: - **Plotly**: 支持交互式的制作,能够轻松处理地理空间数据并生成画效果[^2]。 - **Pyecharts**: 特别适合于中文环境下的应用,支持丰富的可视化类型,并且可以方便地绘制带有时间维度的地变化情况[^4]. #### Plotly 态地示例代码 要利用 Plotly 创建一个简单的态散点来表示不同地点随时间的变化趋势,可按照如下方式进行编程: ```python import plotly.express as px df = px.data.gapminder().query("year==2007") # 加载样例数据集 fig = px.scatter_geo(df, locations="iso_alpha", color="continent", hover_name="country", size="pop", animation_frame="year", projection="natural earth") fig.show() ``` 这段程序会读取内置的世界各国人口统计数据,并通过 `animation_frame` 参数指定按年份播放画。 #### Pyecharts 态地实例 如果想要在中国范围内展示某些指标随着时间推移而发生改变,则可以选择 pyecharts 库来进行开发: ```python from pyecharts.charts import Map from pyecharts import options as opts import pandas as pd data = [ ('广东', 98), ('湖南', 85), ('湖北', 76), ('河南', 67) ] map_ = ( Map(init_opts=opts.InitOpts(width='1200px', height='600px')) .add("", data, "china") .set_global_opts( title_opts=opts.TitleOpts(title="中国省份分布"), visualmap_opts=opts.VisualMapOpts(max_=100)) ) for year in range(2000, 2010): # 假设我们有十年的数据 new_data = [(province, value + year * 5) for province, value in data] map_.add(str(year), new_data, "china") map_.render('dynamic_map.html') ``` 此段脚本构建了一个基础版本的中国省级行政区划热力,并模拟每年数值增长的过程保存HTML 文件以便查看。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值