栈是一种重要的数据结构,满足后进先出,是面试中会重点考察的内容。下面通过例题来学习栈的使用。

1.力扣20.有效的括号[1]

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:
  输入:s = “()”
  输出:true

示例 2:
  输入:s = “()[]{}”
  输出:true

示例 3:
  输入:s = “(]”
  输出:false

括号匹配的过程中,后遇到的左括号要先匹配,满足后进先出,因此可以用栈来解决。

public boolean isValid(String s) {Deque<Character> stack = new LinkedList<>();for (char c : s.toCharArray()) {if (c == '(') stack.push(')');else if (c == '[') stack.push(']');else if (c == '{') stack.push('}');else {if (stack.isEmpty() || c != stack.pop()) return false;}}return stack.isEmpty();
}
2.力扣32. 最长有效括号[2]

给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例 1:
  输入:s = “(()”
  输出:2
  解释:最长有效括号子串是 “()”

示例 2:
  输入:s = “)()())”
  输出:4
  解释:最长有效括号子串是 “()()”

示例 3:
  输入:s = “”
  输出:0

和上一题类似,后遇到的左括号要先匹配,满足后进先出,因此可以用栈来解决。不同的是本题要找最大的可以匹配的长度,因此可以将 push 的对象从括号换成下标便于计算长度。

public int longestValidParentheses(String s) {int ans = 0;LinkedList<Integer> stack = new LinkedList<>();// 初始化放入 -1,第一次匹配时使用// 例如"()",那么右括号下标是 1,1-(-1)=2// 因此栈中的数字表示上一个没有匹配的坐标,例如最开始没有匹配的坐标是-1stack.push(-1);for (int i = 0; i < s.length(); i++) {if (s.charAt(i) == '(') {stack.push(i);  // 将右括号的下标放入队列} else {  // 遇到右括号stack.pop();    // 弹出一个左括号与之进行匹配,下面讨论是否匹配if (stack.isEmpty()) {  // 为空说明没有匹配,因为栈中的数字表示上一个没有匹配的坐标,却全部被弹出了stack.push(i); // 不匹配之后将新的不匹配的下标入栈,作为新的起点} else {   // 不为空才是真正匹配了ans = Math.max(ans, i - stack.peek());    // 更新答案}}}return ans;
}

  凡是需要先进先出的题目,都可以考虑使用栈来实现。在 Java 中,最好使用 LinkedList 来实现栈的功能而不是 Stack。今天的讲解就到这里。下一篇将对队列进行讲解。
欢迎关注公众号。

Reference

[1]力扣20.有效的括号:https://leetcode-cn.com/problems/valid-parentheses

[2]力扣32. 最长有效括号:https://leetcode-cn.com/problems/longest-valid-parentheses

【算法】Java 中栈的使用相关推荐

  1. Java中栈和队列的用法 Stack And Queue

    Java中栈和队列的用法 栈的实现 使用Java的集合类Stack boolean isEmpty();//判断当前栈是否为空,等价于empty(); synchronized E peek();// ...

  2. java中栈和堆都存哪些东西_java中栈内存与堆内存(JVM内存模型)

    java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...

  3. JAVA中栈和堆总结

    堆栈空间分配 栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由O ...

  4. linux java 栈_关于Java中栈与堆的思考

    1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快,仅次于直接位于C ...

  5. java arrays.sort() c_正面刚算法-Java中Arrays.sort()(一)

    最近一直在看关于排序相关的算法,从O(n²)的冒泡.插入.选择到O(nlog(n))的归并.快排.再到桶排序.计数排序.基数排序.各个算法都有自己的优点和缺点,那么jdk中关于这种底层的算法是怎么实现 ...

  6. Java中栈、堆和常量池

    2019独角兽企业重金招聘Python工程师标准>>> Java内存分配主要包括以下几个区域: 寄存器 最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.. 栈 存放基 ...

  7. java中的10的算法,Java中10个常用的排序算法

    import java.util.ArrayList; import java.util.Arrays; public class Sort { public static void main(Str ...

  8. java中栈的两种实现

    栈是先进后出的一种数据结构,如图(来自百度): 好,概念不多说,下面我们来看栈基于链表的实现. 什么是链表?如下 public class Node {int val;Node next;Node(i ...

  9. Java中栈,堆,常量池的简单理解

    常量池存储的是常量,即不能改变的量(final,非new出来的String) 栈存储的是简单数据类型 堆存储的是对象 转载于:https://www.cnblogs.com/ztt0918/p/807 ...

最新文章

  1. 不是碰不到更好的,是因为已经有了你!
  2. 使用transform和transition制作CSS3动画
  3. android查询所有照片,Android查询外部存储中所有照片
  4. ELK系列~对fluentd参数的理解
  5. loj 1063(求割点个数)
  6. 服务器如何修改内存大小,如何限制docker容器的内存大小
  7. android 双清菜单,什么是双清?如何双清手机?安卓手机双清教程
  8. lavavel php 手册,Laravel文档工具
  9. cmd命令查询电脑序列号_查看电脑序列号_查看电脑序列号命令
  10. 整数拼接(记忆化更新)
  11. 计算机网络中如何看别人的共享文件夹,教大家如何使用网络共享文件夹和手机如何使用电脑端查看网络共享-共享文件夹...
  12. 基于 NVIDIA GPU 和 RAPIDS 加速 Spark 3.0
  13. 怎么关闭惠普暗影精灵OMEN 8的主机灯
  14. 打开浏览器时主页被锁定怎么也改不掉的一个好办法
  15. SDUT OJ 3374
  16. redis incr mysql_INCR
  17. 《古剑奇谭WEB》值得期待的三大理由
  18. 还原精灵的另类卸载方法
  19. XTU 1242 Yada Number 巧妙打表
  20. 视频存储价格高昂_避免5个最常见(且代价高昂)的错误,这些错误肯定会导致游戏出轨...

热门文章

  1. php table表单下载,GitHub - Zerolone/auto: 用php生成表格、表单 phh create form table
  2. 古月居 ROS 21 讲1
  3. 开源增长基准及增长速度最快的20个开源软件初创公司
  4. win10系统用虚拟机装win7一直停留在这个画面,请问大家什么这是问题
  5. node-sass模块报错安装不上?试试这个方法,亲测有效
  6. JS高级做的导航条。可展开可挂起。可简化。
  7. PDF阅读软件的使用方法
  8. JAVA2块钱瓶子_啤酒2元一瓶,4个瓶盖换一瓶,2个空瓶换一瓶,问:10元钱可以喝几瓶。用java编程解出答案,求大神们帮忙...
  9. 阅卷管理用c语言编程,模拟人工阅卷C语言编程题自动评阅系统设计与实现.doc
  10. 中国软件杯 公共地点人流量计算的云监管平台 业务部分思路分享