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