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 ...
随机推荐
- Java中集合基础相关知识
1.集合基础 1.1 集合概述 编程的时候如果需要存储多个数据使用长度固定的数据存储,适应不了元素个数变化的需求,这时候我们就需要用集合. 集合类的特点:提供了一种存储空间可变的存储模型,存储的数据容 ...
- js 信息脱敏
前端展示信息时,往往要对身份证号.手机号.地址等这类敏感信息进行部分隐藏显示,就是要脱敏处理 一个简单粗暴的脱敏处理方法记录下: hideSensitiveData (string, saveLeng ...
- CentOS7 yum方式安装mysql 5.7
1.检查服务器上有没有安装mysqlyum安装方式:yum list installed mysql*yum卸载 yum remove 已安装的包卸载完安装包后,删除安装文件rm -rf /var/l ...
- K8SYaml文件详解
一.K8S支持的文件格式 kubernetes支持YAML和JSON文件格式管理资源对象. JSON格式:主要用于api接口之间消息的传递 YAML格式:用于配置和管理,YAML是一种简洁的非标记性语 ...
- GFF2GTF.py2
import sys inFile = open(sys.argv[1],'r') for line in inFile: #skip comment lines that start with th ...
- idea修改背景颜色|护眼色|项目栏背景修改
https://blog.csdn.net/heytyrell/article/details/89743068
- C语言中字符数组的赋值和复制
/*C中,字符串,即字符数组的赋值与字符变量.常量.变量的赋值是不同的.初学者总会犯错误. 常见错误如下: 1.定义的时候直接用字符串赋值 char a[10]; char a[10]="h ...
- jQuery.extend 函数详解(转)
地址:http://www.jb51.net/article/29591.htm JQuery的extend扩展方法: Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些 ...
- mysql-单行处理函数
1 单行处理函数 lower() 对于输出转换成小写 upper()对于输出转换成大写 substr()取子字符串 下标从1开始 length() 去长度 concat()将字符串进行拼接 例:将首字 ...
- Go_day05
Go基础语法 OOP面向对象 Go语言本身不是面向对象的语言,但是可以通过一些方法来模拟对象 面向对象的思维就是分类思维 继承 // 定义一个父类结构体 type Person struct { na ...