day11 | LeetCode20. 有效的括号、LeetCode1047. 删除字符串中的所有相邻重复项、LeetCode150. 逆波兰表达式求值

文章目录

  • day11 | LeetCode20. 有效的括号、LeetCode1047. 删除字符串中的所有相邻重复项、LeetCode150. 逆波兰表达式求值
  • 一、题目:LeetCode****20. 有效的括号****
    • 方法:使用栈匹配解决
      • 1. 思路:
      • 2. 代码实现:
      • 3.复杂度分析:
    • Reference
  • 二、题目:LeetCode****1047. 删除字符串中的所有相邻重复项****
    • 方法:使用栈匹配解决
      • 1. 思路:
      • 2. 代码实现:
      • 3.复杂度分析:
    • Reference
  • 三、题目:LeetCode****150. 逆波兰表达式求值****
    • 方法:使用栈解决
      • 1. 思路:
      • 2. 代码实现:
      • 3. 复杂度分析:
    • 思考:
    • Reference

一、题目:LeetCode20. 有效的括号

链接:20. 有效的括号 - 力扣(LeetCode)

方法:使用栈匹配解决

1. 思路:

在做题之前先分析,可能出现的匹配情况:

  1. { [ ( ] ) ] } :字符串括号右方向多余
  2. { [ ( ] ] } :字符串括号没有多余,但是括号类型没有匹配
  3. { [ ( ( ) ] } :字符串括号左方向多余

这里有个技巧,在匹配左括号时,进行右括号入栈,就只需要比较当前元素和栈顶相不相等就可以了。

2. 代码实现:

class Solution {public boolean isValid(String s) {Deque<Character> deque = new LinkedList<Character>();char ch;for (int i = 0; i < s.length(); i++) {ch = s.charAt(i);if (ch == '(') {deque.push(')');} else if (ch == '[') {deque.push(']');} else if (ch == '{') {deque.push('}');// 遇到不匹配的情况,跳出} else if (deque.isEmpty() || deque.peek() != ch) {return false;// 括号匹配消除} else {deque.pop();}}// 判断栈是否为空,空代表括号全部匹配return deque.isEmpty();}
}

3.复杂度分析:

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)

Reference

  1. 代码随想录 (programmercarl.com)
  2. 栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili

二、题目:LeetCode1047. 删除字符串中的所有相邻重复项

链接:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

方法:使用栈匹配解决

1. 思路:

在做题之前先分析,可能出现的匹配情况:

  1. { [ ( ] ) ] } :字符串括号右方向多余
  2. { [ ( ] ] } :字符串括号没有多余,但是括号类型没有匹配
  3. { [ ( ( ) ] } :字符串括号左方向多余

这里有个技巧,在匹配左括号时,进行右括号入栈,就只需要比较当前元素和栈顶相不相等就可以了。

2. 代码实现:

使用 ArrayDeque 作为堆栈:

class Solution {public String removeDuplicates(String s) {// ArrayDeque会比LinkedList在除了删除元素这一点外会快一点ArrayDeque<Character> deque = new ArrayDeque<>();char ch;for (int i = 0; i < s.length(); i++) {ch = s.charAt(i);// 不匹配放入栈中if (deque.isEmpty() || deque.peek() != ch){deque.push(ch);// 匹配就消除,对对碰} else {deque.pop();}}String str = "";// 剩余的元素即为不重复的元素while (!deque.isEmpty()) {str = deque.pop() + str;}return str;}
}

直接使用字符串来当栈,省去栈转字符串的操作:

class Solution {public String removeDuplicates(String s) {// 将字符串当做栈StringBuffer res = new StringBuffer();int top = -1;for (int i = 0; i < s.length(); i++) {char ch = s.charAt(i);// 栈不为空并且和当前字符匹配if (top >= 0 && res.charAt(top) == ch){res.deleteCharAt(top);top--;// 不匹配存入栈} else {res.append(ch);top++;}}return res.toString();}
}

3.复杂度分析:

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)

Reference

  1. 代码随想录 (programmercarl.com)
  2. 栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项_哔哩哔哩_bilibili

三、题目:LeetCode150. 逆波兰表达式求值

链接:150. 逆波兰表达式求值 - 力扣(LeetCode)

逆波兰表达式:是一种后缀表达式,所谓后缀就是指算符写在后面。

平常使用的算式则是一种中缀表达式,如: ( 1 + 2 ) ∗ ( 3 + 4 ) ( 1 + 2 ) * ( 3 + 4 ) (1+2)∗(3+4) 。

该算式的逆波兰表达式写法为: ( ( 12 + ) ( 34 + ) ∗ ) ( ( 1 2 + ) ( 3 4 + ) * ) ((12+)(34+)∗)。

逆波兰表达式主要有以下两个优点:

  • 去掉括号后表达式无歧义,上式即便写成 12 + 34 + ∗ 1 2 + 3 4 + * 12+34+∗ 也可以依据次序计算出正确结果。
  • 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。

方法:使用栈解决

1. 思路:

本题的本质就是,每一个子表达式要得出结果,然后再拿这个结果进行运算。其实就是一个相邻字符串消除的过程。

2. 代码实现:

class Solution {public int evalRPN(String[] tokens) {Deque<Integer> stack = new LinkedList<>();for (String token : tokens) {if (token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/")) {int num1 = stack.pop();int num2 = stack.pop();// 判断表达式switch (token) {case "+":stack.push(num1 + num2);break;case "-":stack.push(num2 - num1);break;case "*":stack.push(num1 * num2);break;case "/":stack.push(num2 / num1);break;}} else {stack.push(Integer.valueOf(token));}}return stack.pop();}
}

3. 复杂度分析:

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)

思考:

  1. 使用**后缀表达式对计算机来说非常的友好。**计算机只需要从左往右依次的往下扫描,而不需要判断表达式的优先级。

Reference

  1. 代码随想录 (programmercarl.com)
  2. 栈的最后表演! | LeetCode:150. 逆波兰表达式求值_哔哩哔哩_bilibili

代码随想录第11天 | LeetCode20. 有效的括号、LeetCode1047. 删除字符串中的所有相邻重复项、LeetCode150. 逆波兰表达式求值相关推荐

  1. Suzy找到实习了吗Day 11 |栈与队列中途 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

    Day 11 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值 20. 有效的括号 注意栈不是一个数据结构,需要自己用list实现栈的逻辑 class Solu ...

  2. 代码随想录算法训练Day11 LeetCode232. 用栈实现队列(模拟);225.用队列实现栈(模拟);20. 有效的括号(栈应用);1047. 删除字符串中的所有相邻重复项(栈应用)

    代码随想录算法训练Day11 | LeetCode232. 用栈实现队列(模拟):225.用队列实现栈(模拟):20. 有效的括号(栈应用):1047. 删除字符串中的所有相邻重复项(栈应用) 关于栈 ...

  3. 表达式求值(最详细分析+代码实现+表达式之间的相互转换)

    目录 一.概念 二.前缀表达式的逻辑和实现方式 1.定义 2.前缀表达式的计算机求值 3.例子 4.代码实现 三.中缀表达式的逻辑和实现方式 1.定义 2.中缀表达式规则 3.中缀表达式的计算机求值 ...

  4. python前缀表达式求值_python数据结构与算法 11 后缀表达式求值

    从本节开始,删除原版的英文,直接发译后的文稿. 后缀表达式求值 栈的最一个应用例子,计算一个后缀表达式的值.这个例子中仍然用栈的数据结构.不过,当扫描表达式的时候,这次是操作数压栈等待,不是转换算法中 ...

  5. 数据结构 C 代码:表达式求值

    表达式求值 用C语言实现表达式求值算法.要求从键盘输入任意的包含加减乘除的算术四则运算表达式,都能求值.操作数类型可以设定为double. 1 设置运算符栈和运算数栈辅助分析算符优先关系. 2 在读入 ...

  6. 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)

    栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...

  7. C++代码实现中缀表达式求值(基于中缀表达式转后缀表达式)

    C++代码实现中缀表达式求值(基于中缀表达式转后缀表达式) 样例输入:3*(2+5) 样例输出:21 代码:#include <bits/stdc++.h> using namespace ...

  8. 代码随想录 一刷总结(完结)

    一.数组 5 1. 基础知识 连续空间 相同类型元素. 注意java中二维数据是一些不连续的一维数组空间. 易读不易删除. 2. 典型解法 (1) 二分法 适用范围 有序.无重复元素. 时间复杂度O( ...

  9. 7-3 表达式求值_1 (20分) 简单代码

    题目描述 在一个表达式中,只有"(",")","0-9","+","-","*" ...

最新文章

  1. Java Coverage(Cobertura)工具
  2. php https server_使用https,$_SERVER['HTTPS']却不等于on?
  3. 第四范式受邀成为5G消息工作组成员
  4. python ioc di_Sping(一)——IOC/DI
  5. 传感与检测实验报告,差动变压器的特性测定,江南大学物联网自动化
  6. 周记随笔-php5.6与apache2.4的windows32安装
  7. 高性能MySQL之Count统计查询
  8. 3.凤凰架构:构建可靠的大型分布式系统 --- 事务处理
  9. 2020年30米二级分类北京市土地利用数据
  10. 在c语言中的变量分为三种类型,在C语言中的实型变量分为两种类型
  11. SA的空间注意力和通道注意力
  12. 如何用计算机完成一篇文稿制作步骤,第5章 计算机一级演示文稿制作经典教程.ppt...
  13. HDU 6069 题解
  14. Win32 OpenGL 编程(1)Win32下的OpenGL编程必须步骤
  15. 图像的几种变换简单介绍
  16. 【Astar寻路算法图解】Java实现
  17. dockerfile创建镜像与容器卷与容器查看
  18. js + leetcode刷题:No.914 卡牌分组
  19. MATLAB求解方程和多元方程组
  20. ubuntu交叉编译Qt-5库并移植ARM开发板

热门文章

  1. 开源LMS(Learning Management System)即学习管理系统----Moodle
  2. 江苏电信1元拿iPhone 6享百兆宽带
  3. [小北De编程手记] [Lesson 02] AutoFramework构建 之 Page Objects - 设计模式
  4. uibot在子程序执行js失败_使用BotUI搭建js机器人
  5. Oracle账号被锁定处理方式
  6. QQ For Linux在Ubuntu 9.10下经常自动退出的解决方法
  7. 中秋节在女友手上p了一个超级漂亮的月亮
  8. 【Android】Bitmap图像色彩模式:黑白、模糊、老照片、胶卷等(92/100)
  9. windows 登陆 和 pGina
  10. 装修打地板时千万小心排污管