LeeCode 20: 有效的括号

题目描述

给定一个只包括 '(', ')', '{', '}', '[', ']' 的字符串s,判断字符串是否有效。

有效字符串满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

建立模型

  1. 这是一个典型的栈结构的问题
  2. 遇到左括号则入栈,遇到右括号则将栈顶的左括号弹出,并判断是否匹配
    • 匹配:继续下一个字符
    • 不匹配:返回 False,不是有效的字符串
  3. 遍历字符串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 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串,答案保证唯一。

建立模型

  1. 本题和上面有效的括号属于同一类问题
  2. 遍历字符串 S 的每一个字符,若当前字符 == 栈顶字符,则弹出栈顶(等价于删除),否则将当前字符入栈。
  3. 返回栈中最后剩余的字符组成的串

代码实现

# 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: 逆波兰表达式求值

题目描述

根据 逆波兰表达式,求表达式的值。

有效的运算符包括 +, -, *, /。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

建立模型

  1. 本题也是一个栈的问题
  2. 当遇到操作符时,弹出栈顶两个元素用于计算
  3. 当遇到操作数时,则入栈
  4. 最后返回结果

代码实现

# 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 栈与队列问题(一)的更多相关文章

  1. leecode刷题(26)-- 用栈实现队列

    leecode刷题(26)-- 用栈实现队列 用栈实现队列 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返 ...

  2. 学习javascript数据结构(一)——栈和队列

    前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...

  3. [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)

    再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...

  4. 剑指Offer面试题:6.用两个栈实现队列

    一.题目:用两个栈实现队列 题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 原文是使用 ...

  5. C实现栈和队列

    这两天再学习了数据结构的栈和队列,思想很简单,可能是学习PHP那会没有直接使用栈和队列,写的太少,所以用具体代码实现的时候出现了各种错误,感觉还是C语言功底不行.栈和队列不论在面试中还是笔试中都很重要 ...

  6. JavaScript数组模拟栈和队列

    *栈和队列:js中没有真正的栈和队列的类型              一切都是用数组对象模拟的 栈:只能从一端进出的数组,另一端封闭       FILO   何时使用:今后只要仅希望数组只能从一端进 ...

  7. 用JS描述的数据结构及算法表示——栈和队列(基础版)

    前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里 ...

  8. JavaScript中的算法之美——栈、队列、表

    序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...

  9. Java数据结构和算法之栈与队列

    二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为 ...

  10. python数据结构之栈、队列的实现

    这个在官网中list支持,有实现. 补充一下栈,队列的特性: 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIF ...

随机推荐

  1. redis事务和锁机制、持久化操作RDB/AOF

    一.Redis事务介绍 Redis事务是一个单独的隔离操作 :事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断.Redis事务的主要作用就是串联多个 ...

  2. L02.从图灵机到通用计算机

    将程序载入到内存(存储器)中,用一个指针指向它, 再载入到cpu(控制器)中进行解释执行   *(取指执行,产生结果) 取指执行 = 控制器从存储器中取出数据后,分析指令,运算器执行逻辑运算. PC= ...

  3. C# 自定义控件如何正确的继承父类

    C# 自定义控件可以分为三类: 复合控件:基本控件组合而成.应当继承自 UserControl 扩展控件:继承基本控件,扩展一些属性和事件.比如继承 Button 自定义控件:直接继承自 Contro ...

  4. 如何利用 C# + Echarts 绘制 Bar Simple

    背景 Echarts 是百度推出的一个使用 JavaScript 实现的开源可视化库. 该库提供了常规的折线图.柱状图.散点图.饼图.K线图,用于统计的盒形图,用于地理数据可视化的地图.热力图.线图, ...

  5. Spring日志与SpringBoot日志

    本篇意为说明Spring默认日志实现与SpringBoot默认日志实现. 1.日志 在这之前,我们应该先了解一些日志框架. 具体可以看我这篇随笔:https://www.cnblogs.com/dai ...

  6. Arrays.asList()需要注意的点

    千万不要这样使用Arrays.asList ! 测试的几种情况及原因: public static void main(String[] args) { //第一种基本类型数组 int[] arr = ...

  7. 使用python来搭建一个简易的文件下载环境以及用droopy来实现一个文件上传环境

    ubuntu在安装的时候一般都是自带python环境的,大家可以查看一下查看demo如下 用于共享的命令很简单python2: python -m SimpleHTTPServer 8888pytho ...

  8. 记一下Linux环境SpringBoot 用OpenOffice Word转PDF

    环境 Windows或者Linux 首先安装 deb方式 tar -xvzf Apache_OpenOffice_XXXX_Linux_x86-64_install-deb_zh-CN.tar.gz ...

  9. DataTable 导出到TXT

    public static string cExportTXT(DataView dv) { try { SaveFileDialog saveFileDialog1 = new SaveFileDi ...

  10. 如何搭建属于自己的服务器(Linux7.6版)

    从0搭建属于自己的服务器 最近小伙伴推荐的华为云活动,购买服务器相当的划算,本人也是耗费巨资购买了一台2核4G HECS云服务器. 话不多说,在这里给华为云打一个广子,活动力度还是很不错的. 活动详情 ...