为了转行程序员而努力的第三十天-栈

今天又去看了演出,又去聚了餐,还录了声音,也听了网课刷了题,总的来说是比较充实的一天,除了晚上记录的时间剩下比较少。今天刷了两道栈有关的题,感觉其实栈没有链表实现复杂。

今日进度:
1.录了小王子,还录了谚语和英语
2.坚持听网课,刷题
3.坚持锻炼

学习笔记:
1.20. 有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

输入:s = “()”
输出:true

解题思路:使用查找表,将右括号对应的左括号存入。遍历数组,遇到左括号时,将左括号放入栈中,遇到右括号,将栈中的头节点取出与查找表中右括号对应的值比较,如果相等,则说明这一个括号满足要求,结束遍历之后,如果stack里有元素,返回false,否则返回true。

class Solution {
    public boolean isValid(String s) {
        Map<Character, Character> pairs = new HashMap<Character, Character>();
        pairs.put(')', '(');
        pairs.put(']', '[');
        pairs.put('}', '{');
        Deque<Character> stack = new LinkedList<Character>();
        for(int i=0; i<s.length(); i++){
            
            if(pairs.containsKey(s.charAt(i))){
                
                if(stack.peek() != pairs.get(s.charAt(i))){
                    
                    return false;
                }
                else{
                    
                    stack.pop();
                    
                }
            }
            else{
                stack.push(s.charAt(i));
            }
        }
        
        return stack.isEmpty();
    }
}

2.150. 逆波兰表达式求值
根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

输入:tokens = [“2”,“1”,"+",“3”,"*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

解题思路:遍历数组,将数字存入栈,字符串就弹出前两个数字,进行运算符号表示的运算,在放入栈中,继续遍历,直到末尾。栈里只有一个元素,即为表达式的值

class Solution {
    public int evalRPN(String[] tokens) {
        Deque<String> stack = new LinkedList<String>();
        for(int i=0; i<tokens.length; i++){
            if(!(tokens[i].equals("+") || tokens[i].equals("-") || tokens[i].equals("*") || tokens[i].equals("/"))){
                stack.push(tokens[i]);
            }
            else{
                int second = Integer.parseInt(stack.pop());
                int first = Integer.parseInt(stack.pop());
                String tmp = "";
                if(tokens[i].equals("+")){
                    tmp = String.valueOf(first+second);
                }
                if(tokens[i].equals("-")){
                    tmp = String.valueOf(first-second);
                }
                if(tokens[i].equals("*")){
                    tmp = String.valueOf(first*second);
                }
                if(tokens[i].equals("/")){
                    tmp = String.valueOf(first/second);
                }
                stack.push(tmp);
            }
        }
        
        int res = Integer.parseInt(stack.pop());
        return res;
    }
}

明天继续加油刷题,差不多等春节想买一个项目的网课来听,趁春节放假把它做出来。

上一篇:力扣 456. 132 模式


下一篇:关于Thread类中三个interrupt方法的研究与学习(转)