算法修炼Day11|20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值

73 阅读2分钟
题目:20. 有效的括号 - 力扣(LeetCode)
思路/想法:

关键字:匹配/配对,显然思路上可以使用栈。

实现:首先判断栈是否为空,为空则直接入栈。不为空进行判断:用右括号匹配找栈顶元素是否为对应的左括号,是则直接弹出,不是则将当前元素入栈。

代码实现:
class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (!stack.isEmpty()) {
                if (ch == '}' && stack.peek() == '{') {
                    stack.pop();
                } else if (ch == ']' && stack.peek() == '[') {
                    stack.pop();
                } else if (ch == ')' && stack.peek() == '(') {
                    stack.pop();
                } else {
                    stack.push(ch);
                }
            } else {
                stack.push(ch);
            }
        }
        return stack.isEmpty() ? true : false;
    }
}
题目:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
思路/想法:

字母匹配,栈为空时,直接入栈。栈不为空时,将栈顶元素和当前遍历到的元素比较:相同时直接弹出,不相同时直接加入。将栈中元素输出为字符串并进行反转。

代码实现:
class Solution {
    public String removeDuplicates(String s) {
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (!stack.isEmpty()) {
                if (c == stack.peek()) {
                    stack.pop();
                } else {
                    stack.push(c);
                }
            } else {
                stack.push(c);
            }
        }
        StringBuilder result = new StringBuilder();
        while (!stack.isEmpty()) {
            result.append(stack.pop());
        }
        return result.reverse().toString();
    }
}
题目:150. 逆波兰表达式求值 - 力扣(LeetCode)
思路/想法:

字符数组元素判等方式!!使用equals()。

遍历,当遇到加减乘除四个运算符时,从栈中弹出两个数字进行相对应的计算,并将计算结果加入栈中,最后输出栈顶元素即可。

代码实现:
class Solution {
    public int evalRPN(String[] tokens) {
        // 遇到运算符则弹出两个数进行该运算符的计算,否则直接入栈,返回栈顶元素即可
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < tokens.length; i++) {
            
            if (tokens[i].equals("+") || tokens[i].equals("-") || tokens[i].equals("*") || tokens[i].equals("/")) { // 字符串数组使用equals进行判等
                char c = tokens[i].toCharArray()[0];
                int a = stack.pop();
                int b = stack.pop();
                int value = 0;
                if (c == '+') {
                    value = a + b;
                } else if (c == '-') {
                    value = b - a;
                } else if (c == '*') {
                    value = a * b;
                } else if (c == '/') {
                    value = b / a;
                }
                stack.push(value);
            } else {
                stack.push(Integer.parseInt(tokens[i]));
            }
        }
        return stack.peek();
    }
}