您现在的位置是:亿华云 > IT科技类资讯
LeetCode题解之有效的括号(栈)
亿华云2025-10-09 03:25:33【IT科技类资讯】7人已围观
简介前言说完了链表,我们再看看栈。理解栈栈是什么,很金典的比喻就是把 栈 比喻成叠盘子,一个个叠上去,然后拿的时候会先拿最上面的,也就是最后叠上去的那个。先进者后出、后进者先出,这就是栈结构。实际应用那么
前言
说完了链表,题解我们再看看栈。有栈
理解栈
栈是括号什么,很金典的题解比喻就是把 栈 比喻成叠盘子,一个个叠上去,有栈然后拿的括号时候会先拿最上面的,也就是题解最后叠上去的那个。
先进者后出、有栈后进者先出,括号这就是题解栈结构。
实际应用
那么栈在实际应用中有什么场景呢?有栈
可太多了,比如Activity中的括号任务栈,编译器实现方法表达式,题解浏览器的有栈前进后退。
这里拿浏览器的括号前进后退做例子。
在浏览器中,每打开一个页面,就把这个页面入栈,然后点击后退的时候就将页面出栈。这是不是挺像Activity页面的云服务器任务栈的。 如果有前进功能,那么就再需要一个栈,当点击后退的时候,就把页面从A栈出,然后进入B栈,这样点击前进的时候,就能从B栈重新回到A栈了。1)浏览网页,每打开一个网页就入栈A。比如这里打开了网页M和网页N。
2)点击后退,网页N出栈A,入栈B。
3)点击前进,网页N出栈B,入栈A。
Java中的栈类
在Java中,栈的对应类为Stack。
//初始化栈 Stack<String> stack =new Stack<String>(); //入栈 stack.push("test"); //出栈,返回出栈的元素 String str=stack.pop();算法题
还是老样子,来一题栈相关的算法题。
题目
给定一个只包括 (,),{ ,云南idc服务商},[,] 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。
示例 1:输入:s = "()" 输出:true
示例 2:输入:s = "()[]{ }" 输出:true
示例 4:输入:s = "([)]" 输出:false
示例 5:输入:s = "{ []}" 输出:true
解法
解法就是利用栈了。
遇到左括号入栈,遇到右括号就把相应的左括号出栈,如果右括号和要出栈的这个元素不一致,就说明括号没有成对。
关于左括号和右括号的对应关系,可以用HashMap来存储,来一起看看:
public boolean isValid(String s) { int n = s.length(); if (n % 2 == 1) { return false; } Map<Character, Character> pairs = new HashMap<Character, Character>() { { put(), (); put(], [); put(}, { ); }}; Deque<Character> stack = new LinkedList<Character>(); for (int i = 0; i < n; i++) { char ch = s.charAt(i); if (pairs.containsKey(ch)) { if (stack.isEmpty() || stack.peek() != pairs.get(ch)) { return false; } stack.pop(); } else { stack.push(ch); } } return stack.isEmpty(); }也有比较灵活的办法,就是入栈的时候就确定好括号的对应关系,直接入栈左括号对应的右括号。
public boolean isValid(String s) { if(s.isEmpty()) return true; Stack<Character> stack=new Stack<Character>(); for(char c:s.toCharArray()){ if(c==() stack.push()); else if(c=={ ) stack.push(}); else if(c==[) stack.push(]); else if(stack.empty()||c!=stack.pop()) return false; } if(stack.empty()) return true; return false; }时间复杂度
需要遍历字符串,所以时间复杂度为 O(n)
空间复杂度
栈的字符数量最大为n,Map数量为3,服务器租用所以空间复杂度就是O(n)
参考
https://time.geekbang.org/column/article/41222
本文转载自微信公众号「码上积木」,可以通过以下二维码关注。转载本文请联系码上积木公众号。
很赞哦!(17)
相关文章
- 为什么说注册域名注意细节?哪些我们不能忽视?
- 字节跳动开源GAN模型压缩框架,算力最高节省97.8%
- 假期7天学会Elixir,掌握函数式编程与 Actor 模型
- 标准库 Collections 中 4 个常用的数据结构
- 比较短的域名方便用户记忆和传播,它带来的好处往往会超过其他类型的域名,如果你非要域名短而且还要包含关键词,那么往往会事与愿违,现在这种域名基本上是可遇而不可求的。
- 面向开发人员的七个微服务优秀实践
- 我们一起学习排列问题!你会吗?
- 还在用BeanUtils拷贝对象?MapStruct才是王者!
- 当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
- Go泛型:提前掌握Go泛型的基本使用