有效的括号,删除字符串中的所有相邻重复项,逆波兰表达式求值

70 阅读1分钟

1.有效的括号

力扣题目链接

总结出不合格的情况,一共有如下三种

思路:遍历字符串,遇到左括号就将其对应的右括号放入stack中,遇到右括号就会出现三种情况,我们来分别判断。

第一种情况:字符串左方向的括号多余了。对应的情况就是在遍历完字符串之后,stack不为空。此时返回FALSE

第二种情况:括号没有多余,但是括号的类型没有匹配上。对应的情况就是在遍历字符串右括号的过程中,当前的右括号与stack顶部的括号不一致,此时返回FALSE

第三种情况:字符串里右方向的括号多余了,所以不匹配。对应的情况就是在遍历字符串右括号的过程中,stack已经为空了。此时返回FALSE

image.png

public boolean isValid(String s) {
    ArrayDeque<Character> stack = new ArrayDeque<>();
    char ch;
    for (int i = 0; i < s.length(); i++) {
        ch = s.charAt(i);
        //碰到左括号,就把相应的右括号入栈
        if (ch == '(') {
            stack.push(')');
        }else if (ch == '{') {
            stack.push('}');
        }else if (ch == '[') {
            stack.push(']');
        } else if (stack.isEmpty() || stack.peek() != ch) {
            return false;
        }else {//如果是右括号判断是否和栈顶元素匹配
            stack.pop();
        }
    }
    //最后判断栈中元素是否匹配
    return stack.isEmpty();
}

2.删除字符串中的所有相邻重复项

力扣题目链接

public String removeDuplicates(String s) {
    ArrayDeque<Character> stack = new ArrayDeque<>();
    for (int i = 0; i < s.length(); i++) {
        char charAt = s.charAt(i);
        if (stack.isEmpty() || stack.peek() != charAt) {
            stack.push(charAt);
        } else if (stack.peek() == charAt) {
            stack.pop();
        }
    }
    int size = stack.size();
    char[] result = new char[size];
    for (int i = 0; i < size; i++) {
        result[i] = stack.pop();
    }
    //因为栈是先进后出,所以要将结果进行反转
    return reverse(result);
}

public String reverse(char[] chars) {
    int start = 0;
    int end = chars.length - 1;
    char temp;
    while (start < end) {
        temp = chars[start];
        chars[start] = chars[end];
        chars[end] = temp;
        start++;
        end--;
    }
    return new String(chars);
}

3. 逆波兰表达式求值

力扣题目链接

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();
}

4. 插入一个题外话

image.png

解答 ↓↓↓

image.png