今天又去看了演出,又去聚了餐,还录了声音,也听了网课刷了题,总的来说是比较充实的一天,除了晚上记录的时间剩下比较少。今天刷了两道栈有关的题,感觉其实栈没有链表实现复杂。
今日进度:
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; } }
明天继续加油刷题,差不多等春节想买一个项目的网课来听,趁春节放假把它做出来。