LeeCode 栈与队列问题(一)
LeeCode 20: 有效的括号
题目描述
给定一个只包括 '(', ')', '{', '}', '[', ']' 的字符串s,判断字符串是否有效。
有效字符串满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
建立模型
- 这是一个典型的栈结构的问题
- 遇到左括号则入栈,遇到右括号则将栈顶的左括号弹出,并判断是否匹配
- 匹配:继续下一个字符
- 不匹配:返回
False,不是有效的字符串
- 遍历字符串s的每一个字符,若最后栈为空,则说明字符串有效
代码实现
# Python3 实现
def isValid(self, s: str) -> bool:
if len(s) % 2:
return False
dict = {}
dict[')'] = '('
dict['}'] = '{'
dict[']'] = '['
stack = []
for ch in s:
if ch in dict.keys():
if not stack or stack[-1] != dict[ch]:
return False
stack.pop()
else:
stack.append(ch)
return not stack
// Java 实现
public boolean isValid(String s) {
if (s.length() % 2 != 0) {
return false;
}
Map<Character, Character> map = new HashMap<>();
map.put(')', '(');
map.put('}', '{');
map.put(']', '[');
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (map.containsKey(c)) {
if (stack.isEmpty() || stack.peek() != map.get(c)) {
return false;
}
stack.pop();
}
else {
stack.push(c);
}
}
return stack.isEmpty();
}
LeeCode 1047: 删除字符串中的所有相邻重复项
题目描述
给出由小写字母组成的字符串
S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串,答案保证唯一。
建立模型
- 本题和上面有效的括号属于同一类问题
- 遍历字符串 S 的每一个字符,若当前字符 == 栈顶字符,则弹出栈顶(等价于删除),否则将当前字符入栈。
- 返回栈中最后剩余的字符组成的串
代码实现
# Python3 实现
def RemoveDuplicates(self, s: str) -> str:
stack = []
for c in s:
if not stack:
stack.append(c)
else:
peek = stack[-1]
if peek == c:
stack.pop()
continue
else:
stack.append()
return ''.join(stack)
// Java 实现
public String RemoveDuplicates(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (stack.isEmpty() || c != stack.peek()) {
stack.push(c);
}
else {
stack.pop();
}
}
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty()) {
sb.insert(0, stack.pop());
}
return sb.toString();
}
LeeCode 150: 逆波兰表达式求值
题目描述
根据 逆波兰表达式,求表达式的值。
有效的运算符包括
+, -, *, /。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
建立模型
- 本题也是一个栈的问题
- 当遇到操作符时,弹出栈顶两个元素用于计算
- 当遇到操作数时,则入栈
- 最后返回结果
代码实现
# Python3 实现
def EvalRPN(self, tokens: List[str]) -> int:
stack = []
ops = ['+', '-', '*', '/']
for token in tokens:
if token not in ops:
stack.append(int(token))
else:
data1 = stack.pop()
data2 = stack.pop()
if token == '+':
stack.append(data2 + data1)
elif token == '-':
stack.append(data2 - data1)
elif token == '*':
stack.append(data2 * data1)
elif token == '/':
stack.append(int(data2 / data1))
else:
print("Unknown Condition.")
return 0
return stack.pop()
// Java 实现
public int EvalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
Set<String> ops = new HashSet<>(); /* 存储操作符 */
set.add("+");
set.add("-");
set.add("*");
set.add("/");
for (String token : tokens) {
if (!ops.contains(token)) {
stack.push(Integer.valueOf(token));
}
else {
int data1 = stack.pop();
int data2 = stack.pop();
switch(token) {
case "+":
stack.push(data2 + data1);
break;
case "-":
stack.push(data2 - data1);
break;
case "*":
stack.push(data2 * data1);
break;
case "/":
stack.push(data2 / data1);
break;
default:
System.out.println("Unknown Condition!");
}
}
}
return stack.pop();
}
LeeCode 栈与队列问题(一)的更多相关文章
- leecode刷题(26)-- 用栈实现队列
leecode刷题(26)-- 用栈实现队列 用栈实现队列 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返 ...
- 学习javascript数据结构(一)——栈和队列
前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...
- [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)
再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...
- 剑指Offer面试题:6.用两个栈实现队列
一.题目:用两个栈实现队列 题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 原文是使用 ...
- C实现栈和队列
这两天再学习了数据结构的栈和队列,思想很简单,可能是学习PHP那会没有直接使用栈和队列,写的太少,所以用具体代码实现的时候出现了各种错误,感觉还是C语言功底不行.栈和队列不论在面试中还是笔试中都很重要 ...
- JavaScript数组模拟栈和队列
*栈和队列:js中没有真正的栈和队列的类型 一切都是用数组对象模拟的 栈:只能从一端进出的数组,另一端封闭 FILO 何时使用:今后只要仅希望数组只能从一端进 ...
- 用JS描述的数据结构及算法表示——栈和队列(基础版)
前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里 ...
- JavaScript中的算法之美——栈、队列、表
序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...
- Java数据结构和算法之栈与队列
二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为 ...
- python数据结构之栈、队列的实现
这个在官网中list支持,有实现. 补充一下栈,队列的特性: 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIF ...
随机推荐
- prometheus 配置数据保留7天时间storage.tsdb.retention.time
1.修改配置如下: 默认24h添加配置:retention: 168h
- 浏览器上验证xpath元素是否正确
一.验证元素定位 Chrome的console可以用来验证XPath和CSS. 1.验证XPath 1.输入:$x("your_xpath_selector")2.输入完毕后,点击 ...
- python3GUI--轮播图效果展示By:PyQt5(附源码下载地址)
@ 目录 一.前言 二.展示 1.酷我音乐 2.QQ飞车 3.虎牙 4.网易云音乐 5.英雄联盟 6.英雄联盟(Pro) 7.腾讯视频 三.源代码 1.demo02GUI.py 2.engine.py ...
- 09 Hive安装与操作
一.安装Hive 下载解压重命名权限 配置环境变量 修改Hive配置文件 修改/usr/local/hive/conf下的hive-site.xml 1 2 3 4 5 6 7 8 9 10 11 1 ...
- Eclipse离线安装svn插件下载
site-1.4.8.zip site-1.6.18.zip site-1.8.22.zip site-1.10.9.zip site-1.10.13-1.9.x.zip site-1.10.13-1 ...
- (二).JavaScript的运算符和表达式,数据类型转化
4. 运算符和表达式 4.3 赋值运算符和表达式 1.赋值运算符 = 作用:赋值运算符就是将右边的内容赋值给左边的变量或属性. var result = 1 + 2; 2.复合赋值运算符 +=,-=, ...
- Pytorch slp singleLayerPerceptron 单层感知机
单层感知机 \[\begin{aligned} & y = XW + b \\ & y = \sum x_i*w_i+b\\ \end{aligned} \] Derivative \ ...
- 基于C语言的小学四则运算出题器
一.实验目的: 1.帮助老师产出每周随机的300道含有两个运算符的四则运算,. 2.每次题目的产出均为随机,增强同学的四则运算能力. 二.实验环境: Visual C++ 三.实验内容: 1.实现随机 ...
- 更新Vue-cli4与Eslint插件自动保存
Vue-cli更新 此更新为Vue-cli3更新为4,可使用node来查看本机的安装版本,vue -V,此版本(cli4)需要node v8.9 或更高版本 (推荐 v10 以上),查看node版本可 ...
- Apache + PHP + Mysql Windows下配置
1.安装Apache 下载网址 http://httpd.apache.org/download.cgi#apache24 二.下载php 下载地址:https://www.php.net/downl ...