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 ...
随机推荐
- mybatis的sql操作
1.Mapper接口创建 创建Mapper包,所有的Mapper接口放在该包下.Mapper接口中声明将要实现的方法,在接下来的Mapper.xml文件中实现对应方法. 2.Mapper.xml创建 ...
- openfire开源IM服务器知识分享+社交app实战
一. 概述 Openfire最主要的功能是实现XMPP服务器,简单来说,openfire为我们提供一个固定的地址,我们只需要向openfire服务器发送标准的XMPP信息(即XML文件流), ...
- Linux系列---【内存占用过高问题排查思路】
内存占用过高问题排查思路 1.使用top命令查看后台任务 按shift+M使应用按内存使用率排序,定位到第一个使用内存最高的应用,并找到对应的PID. 2.使用ps命令查看对应的pid对应哪个应用 p ...
- linux中安装启动postgresql教程
安装: 官网地址:https://www.postgresql.org 选择下载版本: https://www.postgresql.org/ftp/source 下载方式: wget https:/ ...
- Sentinel介绍与使用
https://blog.csdn.net/noaman_wgs/article/details/103328793
- MSSQL T-SQL 基础 (创建、增、删、改)
1.创建数据库 create database StudentAchievementMS ----创建数据库,可以只执行此行来创建数据库,但以下属性都是默认 on primary --主数据文件 ( ...
- 【git入门】基于阿里云搭建git
本文旨在说明基本的git使用流程,分为以下几个部分: 1.安装git环境 2.注册 3.git基本操作 一.安装git环境 第一次使用git,需要先安装配置git环境,windows版下载地址http ...
- ABP vNext微服务架构详细教程——简介
概述 该系列文章主要展示ABP vNext框架在微服务架构下的用法,提供一套可落地的技术实现思路,并演示各服务在Kubernetes下的部署方案. 基础概念 ABP vNext:基于ASP.NET C ...
- idea导入数据库
yml文件(在启动项文件(main)里,eg:springbook文件里面) sh-bean里org.example.sh.beans的Category类 CategoryDAO名字要和Categ ...
- 《Unix/Linux系统编程》第十周学习笔记
<Unix/Linux系统编程>第十周学习笔记 块设备I/O和缓冲区管理 解释块设备I/O的原理和I/O缓冲的优点 I/O缓冲区:内核中的一系列NBUF缓冲区用作缓冲区缓存.每个缓冲区用一 ...