- 20. 有效的括号
本题的要求将相同种类的左括号与右括号进行匹配。
右括号必须与最近的左括号进行匹配,这样的匹配方式符合栈的后进先出结构,因此用栈结构进行解题。 -
class Solution { public boolean isValid(String s) { Deque<Character> stack=new ArrayDeque<Character>(); for(int i=0;i<s.length();i++){ char c=s.charAt(i); if(stack.isEmpty()&&(c==']'||c=='}'||c==')')) return false; if(c=='['||c=='('||c=='{') stack.push(c); if(c==')'&&stack.pop()!='(') return false; if(c==']'&&stack.pop()!='[') return false; if(c=='}'&&stack.pop()!='{') return false; } if(stack.isEmpty()) return true; else return false; } } - 1047. 删除字符串中的所有相邻重复项
删除相邻重复项的本质也是栈的后进先出,将字符串每个字符按顺序入栈,遇到相同字符一起pop出栈。class Solution { public String removeDuplicates(String s) { StringBuilder ans=new StringBuilder(); int top=-1; for(int i=0;i<s.length();i++){ char c=s.charAt(i); if(top>=0&&ans.charAt(top)==c) ans.deleteCharAt(top--); else{ ans.append(c); top++; } } return ans.toString(); } } - 150. 逆波兰表达式求值
- 本题是模拟逆波兰表达式求值的过程,逆波兰表达式的运算逻辑是,从左到右进行遍历,遇到运算符号则对运算符号前两个数进行运算并且将结果放回运算符号所在的位置在重复以上逻辑即可。
该过程可以借助栈结构,遇到数字入栈,遇到运算符号后将栈顶的两个元素pop出来进行运算后将结果重新入栈,最后栈里只剩下一个元素即为运算结果。 -
class Solution { public int evalRPN(String[] tokens) { Deque<Integer> stack = new LinkedList(); for (String s : tokens) { if ("+".equals(s)) { // leetcode 内置jdk的问题,不能使用==判断字符串是否相等 stack.push(stack.pop() + stack.pop()); // 注意 - 和/ 需要特殊处理 } else if ("-".equals(s)) { stack.push(-stack.pop() + stack.pop()); } else if ("*".equals(s)) { stack.push(stack.pop() * stack.pop()); } else if ("/".equals(s)) { int temp1 = stack.pop(); int temp2 = stack.pop(); stack.push(temp2 / temp1); } else { stack.push(Integer.valueOf(s)); } } return stack.pop(); } }
代码随想录算法训练营day11|栈和队列part02
最新推荐文章于 2026-01-28 08:28:59 发布

578

被折叠的 条评论
为什么被折叠?



