刷题日记10
今天大年初四!休息了3天,重新开始刷题!今日主题依然是栈和队列。
20. 有效的括号
这道题思路很简单,把每个"(", "[" ,"{" 都压入栈中,如果栈为空或者栈顶的元素和字符不同直接返回false,相同则弹出栈顶元素。最后判断栈是否为空。
class Solution {
public boolean isValid(String s) {
Stack<Character> st = new Stack<>();
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) == '('){
st.push(')');
}else if(s.charAt(i) == '{'){
st.push('}');
}else if(s.charAt(i) == '['){
st.push(']');
}else if(st.isEmpty() || s.charAt(i) != st.peek()){
return false;
}else{
st.pop();
}
}
return st.isEmpty();
}
}
1047. 删除字符串中的所有相邻重复项
思路很简单,用队列或者栈保存字符,遇到相同的就弹出。
public String removeDuplicates(String s) {
Deque<Character> q = new ArrayDeque<>();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if(!q.isEmpty() && q.peekLast() == c){
q.pollLast();
}else{
q.offerLast(c);
}
}
while(!q.isEmpty()){
sb.append(q.pollFirst());
}
return sb.toString();
}
}a
150. 逆波兰表达式求值
用栈来进行四则运算
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> s = new Stack<>();
for(int i = 0; i < tokens.length; i++){
int v1, v2;
if("+".equals(tokens[i])){
v2 = s.pop();
v1 = s.pop();
s.push(v1 + v2);
}else if("-".equals(tokens[i])){
v2 = s.pop();
v1 = s.pop();
s.push(v1 - v2);
}else if("*".equals(tokens[i])){
v2 = s.pop();
v1 = s.pop();
s.push(v1 * v2);
}else if("/".equals(tokens[i])){
v2 = s.pop();
v1 = s.pop();
s.push(v1 / v2);
}else{
s.push(Integer.valueOf(tokens[i]));
}
}
return s.pop();
}
}