代码随想录算法训练营Day9 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值

LeetCode 20 有效的括号

代码随想录算法训练营Day9 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值_第1张图片

本题思路:利用栈来完成,如果遇到左括号类型就放入栈,如果遇到右括号类型,就弹出栈顶的元素和该元素进行匹配,如果不匹配就返回 false。

注意点:

  1. 第一个就是右括号类型,那么肯定是不匹配的,此时只需要判断栈元素是否为空,如果为空,直接返回 false;
  2. 只有一个左括号类型, 如果已经遍历到末尾,那么判断栈是否为空,如果为空则返回 true, 不空则返回 false
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack();
        char[] c = s.toCharArray();
        int i = 0;
        for (i = 0; i < c.length; i++) {
            if (c[i] == '(' || c[i] == '{' || c[i] == '[') {
                stack.push(c[i]);
            } else {
				// 栈不为空,才能匹配
                if (!stack.isEmpty()) {
                    char pop = stack.pop();
                    if (c[i] == ')' && pop == '(') {

                    } else if (c[i] == '}' && pop == '{') {

                    } else if (c[i] == ']' && pop == '[') {

                    } else { // 如果不匹配
                        return false;
                    }
                } else { // 栈为空,不匹配
                    return false;
                }
            }

        }
        if(stack.isEmpty()){
            return true;
        }
        return false;
    }

LeetCode 1047 删除字符串中的所有相邻重复项

代码随想录算法训练营Day9 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值_第2张图片

本题思路: 利用一个栈来完成, 分为两步

  • 再进入栈之前先判断是否为空,如果空的情况下直接就进栈
  • 如果不为空,则判断当前元素和栈顶元素是否一样,如果一样,就弹出栈顶元素

为了方便理解,画一幅图来讲解一下示例

  • 初始状态下,栈为空代码随想录算法训练营Day9 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值_第3张图片
  • 根据上图,我们直接入栈即可代码随想录算法训练营Day9 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值_第4张图片
  • 根据上图,此时栈不为空,b也不等于a,所以直接入栈代码随想录算法训练营Day9 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值_第5张图片
  • 根据上图,此时不为空,但是b等于栈顶元素,所以弹出b代码随想录算法训练营Day9 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值_第6张图片
  • 根据上图,此时栈不为空,但是a等于栈顶元素a,所以弹出a代码随想录算法训练营Day9 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值_第7张图片
  • 根据上图,此时栈为空,直接入c即可代码随想录算法训练营Day9 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值_第8张图片
  • 根据上图,此时栈不为空,并且a不等于c,直接入栈代码随想录算法训练营Day9 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值_第9张图片
  • 最后返回所剩下的元素就是字符串,需要倒置一下顺序即可
class Solution {
    public String removeDuplicates(String s) {
        char[] array = s.toCharArray();
        Stack<Character> stack = new Stack();
        for(int i = 0; i < array.length; i++){
            // 栈为空直接入
            if(stack.isEmpty()){
                stack.push(array[i]);
            }else{ // 栈不为空的情况下,
                char pop = stack.peek();
                // 入栈前先判断栈顶元素是否和要入栈元素相同,如果相同就弹出栈顶元素
                if(array[i] == pop){
                    stack.pop();
                }else{
                    stack.push(array[i]);
                }
            }
        }
        char[] tmp = new char[stack.size()];
        for(int i = tmp.length - 1; i >= 0 ; i--){
            tmp[i] = stack.pop();
        }
        return new String(tmp);
    }
}

LeetCode 150 逆波兰表达式求值

代码随想录算法训练营Day9 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值_第10张图片

本题思路: 利用栈来完成

  • 遇到数字就放入栈中
  • 遇到符号,就弹出两位进行计算后,又放入栈中
  • 最终剩下的一个元素就是就结果,弹出即可
class Solution {
public static int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack();
        for (int i = 0; i < tokens.length; i++) {
            if (isNumber(tokens[i])) {
                stack.push(Integer.parseInt(tokens[i]));
            } else { //                
                int a = stack.pop();
                int b = stack.pop();
                if (tokens[i].equals("+")) {
                    stack.push(a+b);
                } else if (tokens[i].equals("-")) {
                    stack.push(b-a);
                } else if (tokens[i].equals("*") ) {
                    stack.push(b*a);
                } else {
                    stack.push(b/a);
                }
            }
        }
        int ans =stack.pop();
        return ans;
    }

    public static boolean isNumber(String token) {
        return !("+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token));
    }
}

注意点: 字符串比较一定要用 equals 来进行,不然就会出现错误异常!!

你可能感兴趣的:(代码随想录,算法)