20. 有效的括号
class Solution {
public boolean isValid(String s) {
Stack<Character> stk = new Stack<>();
for(int i = 0; i < s.length(); i++){
char ch = s.charAt(i);
if(ch == '(')stk.push(')');
else if(ch == '[')stk.push(']');
else if(ch == '{')stk.push('}');
else if(stk.isEmpty() || ch != stk.peek())return false;
else stk.pop();
}
return stk.isEmpty();
}
}
1047. 删除字符串中的所有相邻重复项
注意是删除所有相邻重复项,一个都不留。
class Solution {
public String removeDuplicates(String s) {
Stack<Character> stk = new Stack<>();
for(int i = 0; i < s.length(); i++){
char ch = s.charAt(i);
if(stk.isEmpty() || ch != stk.peek()){
stk.push(ch);
}
else{
stk.pop();
}
}
StringBuilder sb = new StringBuilder();
while(!stk.isEmpty()){
sb.append(stk.pop());
}
return sb.reverse().toString();
}
}
150. 逆波兰表达式求值
class Solution {
public int evalRPN(String[] tokens) {
// 遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。
// 注意 - 和/ 需要特殊处理,因为减法和除法的两个数顺序会影响结果
// 但总的来说可以总结为: 后出栈的数 操作符 先出栈的数
Deque<Integer> stack = new LinkedList<>();
for(String s : tokens){
if(s.equals("+")){
stack.push(stack.pop() + stack.pop());
}
else if(s.equals("-")){
stack.push(-stack.pop() + stack.pop());
}
else if(s.equals("*")){
stack.push(stack.pop() * stack.pop());
}
else if(s.equals("/")){
int temp1 = stack.pop();
int temp2 = stack.pop();
stack.push(temp2 / temp1);
}
else{
stack.push(Integer.valueOf(s));
}
}
return stack.pop();
}
}