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 ... 
随机推荐
- Python 错误:TypeError: range() takes no keyword arguments
			问题描述: for循环时使用range()出错: for page in range(start=1, stop=8 + 1,step=1): print(page) 结果报错TypeError: r ... 
- python3GUI--天气预报小工具By:PyQt5(附源码)
			@ 目录 一.准备工作 二.预览 1.启动 2.添加城市 三.设计流程 1.UI设计(草图) 2.UI设计(QT设计师) 3.解释 四.源代码 五.总结 之前用tk写过一款python3GUI--天气 ... 
- 简单了解promise
			promise是什么: JavaScript中存在很多异步操作, Promise将异步操作队列化,按照期望的顺序执行,返回 符合预期的结果.可以通过链式调用多个 Promise达到我们的目的. Pro ... 
- numpy基本使用(一)
			一.简介 NumPy(Numerical Python) 是用于科学计算及数据处理的Python扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. 二.数据结构 n ... 
- flink 启动job命令
			0. 启动flink-session ./bin/yarn-session.sh -n 4 -s 3 -jm 2048 -tm 6144 高版本 bin/yarn-session.sh -d -s 3 ... 
- HarmonyOS_Text_Image
			Text组件 ohos:属性 id="$+id:text_helloworld" #在程序中控制,需要id="$+id:name",转回MainAbilityS ... 
- 代理模式_v1
			代理模式 概念: 1.真实对象:要被代理的对象 2.代理对象 3.代理模式 : 代理对象代理真实对象,达到增强真实对象功能的作用 实现方式: 1.静态代理:有一个类文件描述代理模式 2.动态代理:在内 ... 
- 基于Extjs web设计器
			通过从左边的树拖入字段到右边,编辑字段属性,在界面所见即所得 进入链接 http://www.e-ipd.com:8080/crk/public/login.aspx?ReturnUrl=%2fcrk ... 
- Oracle数据库安装时,安装报错ins_emagent.mk
			安装oracle数据库过程中,通过图形界面安装,出现ins_emagent.mk报错提示 解决方法 修改$ORACLE_HOME/sysman/lib/ins_emagent.mk,将$(MK_EMA ... 
- 本地项目导入svn托管
