20.有效的括号
技巧:使用栈;当遍历到左括号在栈中加入右括号,方便比较,因此使用哈希表也很方便。(想不到的地方)
class Solution {
public boolean isValid(String s) {
Stack<Character> stack=new Stack<>();
for(int i=0;i<s.length();i++){
char ch=s.charAt(i);
if(ch=='('){
stack.push(')');
}else if(ch=='['){
stack.push(']');
}else if(ch=='{'){
stack.push('}');
}else if(stack.empty()||stack.peek()!=ch){
return false;
}else if(stack.peek()==ch){
stack.pop();
}
}
return stack.empty();
}
}
1047删除相邻重复项
题目链接:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
和上一题类似
class Solution {
public String removeDuplicates(String s) {
Stack<Character> stack=new Stack<>();
for(int i=0;i<s.length();i++){
char ch=s.charAt(i);
if(stack.empty()){
stack.push(ch);
}else{
if(ch!=stack.peek()){
stack.push(ch);
}else{
stack.pop();
}
}
}
StringBuilder sb=new StringBuilder();
while(!stack.empty()){
sb.append(stack.pop());
}
return sb.reverse().toString();
}
}
150后缀表达式求值
题目链接:150. 逆波兰表达式求值 - 力扣(LeetCode)
卡的点在于如何将String类型变成Integer类型 ,使用函数Integer.valueOf();(注意大小写)。字符串比较要用equals函数,尽量用已知的字符来调用,避免出现空值异常。例如:"+".equals(s)
值得注意的是除法和减法时,先弹出来的是除数和减去的数。应该用变量记录下来。
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new LinkedList();
for (String s : tokens) {
if ("+".equals(s)) {
stack.push(stack.pop() + stack.pop()); // 注意 - 和/ 需要特殊处理
} else if ("-".equals(s)) {
stack.push(-stack.pop() + stack.pop());
} else if ("*".equals(s)) {
stack.push(stack.pop() * stack.pop());
} else if ("/".equals(s)) {
int temp1 = stack.pop();
int temp2 = stack.pop();
stack.push(temp2 / temp1);
} else {
stack.push(Integer.valueOf(s));
}
}
return stack.pop();
}
}