由于栈结构的特殊性,非常适合做对称匹配类的题目。
Leetcode 20 力扣
首先要弄清楚,字符串里的括号不匹配有几种情况
解法:括号不匹配情况1.左括号多余。2完全匹配类型不匹配。3右括号多余。
入栈小技巧,遇到左括号,入栈右括号然后和栈顶元素对比
// 第一种情况,字符串里左方向的括号多余了 ,所以不匹配 // 第二种情况,括号没有多余,但是 括号的类型没有匹配上 // 第三种情况,字符串里右方向的括号多余了,所以不匹配 public static boolean isValid(String s) { Stack<Character> stack = new Stack<>(); char[] chars = s.toCharArray(); for (Character c:chars) { //碰到左括号,就把相应的右括号入栈 if ((c == '(')){ stack.push(')'); } else if (c == '['){ stack.push(']'); } else if (c == '{'){ stack.push('}'); } else if (stack.isEmpty() || stack.peek() != c){ // 第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false // 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false return false; } else { stack.pop(); } } return stack.isEmpty(); // 第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false }
Leetcode 1074 力扣
解法:堆栈消除元素,堆栈不为空,堆栈元素拿出来和串里元素作比较,相同消除,否则加入堆栈
public static String removeDuplicates(String s) { Stack<Character> stack = new Stack<>(); Deque<Character> deque = new ArrayDeque<>(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (!deque.isEmpty() && deque.peek().equals(c)){ // 堆栈里面不为空,拿出来和串里字符对比,相同就消除,否则入堆栈 deque.pop(); }else { deque.push(c); } } StringBuilder builder = new StringBuilder(); while (!deque.isEmpty()){ // 堆栈里面剩余的就是不重复的字符,输出即可 builder.append(deque.pop()); } return builder.reverse().toString(); }
Leetcode 150 力扣
解法:遇到数字入栈,遇到操作符弹出计算结果后数字再入栈,遍历完成后弹出栈中结果
public static int evalRPN(String[] tokens) { Stack<Integer> stack = new Stack<>(); for (int i = 0; i < tokens.length; i++) { String s = tokens[i]; if (s.equals("+")) { stack.push(stack.pop() + stack.pop()); } else if (s.equals("-")) { // 减法注意谁减谁,后入先出 Integer num1 = stack.pop(); Integer num2 = stack.pop(); stack.push(num2 - num1); } else if (s.equals("*")) { stack.push(stack.pop() * stack.pop()); } else if (s.equals("/")) { // 除法注意谁除谁,后入先出 Integer num1 = stack.pop(); Integer num2 = stack.pop(); stack.push(num2 / num1); } else { stack.push(Integer.valueOf(s)); } } return stack.pop(); }