代码随想录 第11天 | 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值
Leetcode:20. 有效的括号 - 力扣(LeetCode)
思路:就是用栈存左右括号,都为0就说明true,不为零说明有没有匹配成功的括号,是false,思路没有问题,时间超时了,还得用C++...,
java更好的思路如下:如果是左括号,push右括号,如果是右括号,判断是否与栈顶元素匹配,
JAVA
package leetcode.editor.cn; import java.util.*; public class ID20ValidParentheses{ public static void main(String[] args) { Solution solution = new ID20ValidParentheses().new Solution(); StringBuilder sb = new StringBuilder(); //执行测试 System.out.println(sb); } //leetcode submit region begin(Prohibit modification and deletion) class Solution { public boolean isValid(String s) { Deque<Character> deque = new LinkedList<>(); char ch; for (int i = 0; i < s.length(); i++) { ch = s.charAt(i); //碰到左括号,就把相应的右括号入栈 if (ch == '(') { deque.push(')'); }else if (ch == '{') { deque.push('}'); }else if (ch == '[') { deque.push(']'); } else if (deque.isEmpty() || deque.peek() != ch) { return false; }else {//如果是右括号判断是否和栈顶元素匹配 deque.pop(); } } //最后判断栈中元素是否匹配 return deque.isEmpty(); } } //leetcode submit region end(Prohibit modification and deletion) }
leetcode:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
思路:比较简单,和上边括号匹配一样。
JAVA 用字符串模拟栈
class Solution { public String removeDuplicates(String s) { StringBuffer sb = new StringBuffer(); //用字符串模拟栈 //top模拟栈顶指针 int top = -1; for(int i = 0; i < s.length() ; i++){ char c = s.charAt(i); //若top与c相等说明相邻重复,直接删除 if(top >= 0 && c == sb.charAt(top) ){ sb.deleteCharAt(top); top--; }else { //不相等就添加到栈中 sb.append(c); top++; } } return sb.toString(); } }
扩展双指针:
栈
leetcode:150. 逆波兰表达式求值 - 力扣(LeetCode)
思路:由于整个字符串数组只有数字和符号组成,所以只要分辨开来就可以,四则运算时取出前两个pop顶端元素来做运算,运算完的结果再压入到栈里(push),因为栈的先进后出缘故,需要注意的是-和/的顺序。
class Solution { public int evalRPN(String[] tokens) { Stack<Integer> stack = new Stack<>(); for(String i : tokens){ if("+".equals(i)){ stack.push(stack.pop()+stack.pop()); }else if("-".equals(i)){ //因为栈是先进后出,所以先出来的是减数,然后是被减数,所以要加-号 stack.push(-stack.pop()+stack.pop()); } else if ("*".equals(i)) { stack.push(stack.pop()*stack.pop()); } else if ("/".equals(i)) { //要注意被除数和除数顺序,同- int temp2 = stack.pop(); int temp1 = stack.pop(); stack.push(temp1/temp2); } else { //不是四则运算,是数字 //将字符串转换为Integer stack.push(Integer.valueOf(i)); } } return stack.pop(); } }