代码随想录 第11天 | 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值

Leetcode:20. 有效的括号 - 力扣(LeetCode)

思路:就是用栈存左右括号,都为0就说明true,不为零说明有没有匹配成功的括号,是false,思路没有问题,时间超时了,还得用C++...,

java更好的思路如下:如果是左括号,push右括号,如果是右括号,判断是否与栈顶元素匹配,

JAVA

//deque.isEmpty();这个方法返回一个布尔值。如果deque为空,则返回true;如果deque不为空,则返回false。

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

 

posted @ 2024-03-03 12:12  22软工冷薄  阅读(3)  评论(0编辑  收藏  举报