20. 有效的括号
分析:匹配的规则是,创建一个栈,然后遍历一遍字符串,当碰到左括号时,在栈中加入与之匹配的右括号,因为左括号必须以正确的顺序闭合,所以当遍历到右括号时,将其与栈顶元素相比较,如果不相等则不符合规则,直接return false;否则弹出栈顶,比较下一个括号。判断返回true的条件有如下三点:
当左右括号不符合匹配规则时,return false
当字符串未遍历完但是栈已经空时,return false
当字符串已经遍历完了但是栈仍然不为空时,return false
代码:
public boolean isValid(String s) {
if(s.length() % 2 == 1){
return false;
}
char[] s1 = s.toCharArray();
Deque<Character> stack = new ArrayDeque<>();
for(int i = 0; i < s.length(); i++){
if(s1[i] == '('){
stack.push(')');
}else if(s1[i] == '{'){
stack.push('}');
}else if(s1[i] == '['){
stack.push(']');
}else if(stack.isEmpty() || s1[i] != stack.peek()){
return false;
}else{
stack.pop();
}
}
if(!stack.isEmpty()){
return false;
}
return true;
}
1047. 删除字符串中的所有相邻重复项
分析:遍历整个字符串,将当前元素与栈顶元素相比,如果该元素和栈顶元素相同,则弹出栈顶元素并跳过当前遍历的元素继续向后遍历,否则,将该元素加入栈中,最后逆序输出栈中元素组合即可得到答案。
代码:
public String removeDuplicates(String s) {
char[] s1 = s.toCharArray();
Deque<Character> stack = new LinkedList<>();
for(int i = 0; i < s1.length; i++){
if(stack.isEmpty()){
stack.push(s1[i]);
continue;
}
char temp = stack.peek();
if(temp == s1[i]){
stack.pop();
}else{
stack.push(s1[i]);
}
}
char[] result = new char[stack.size()];
for(int i = result.length - 1; i >= 0; i--){
result[i] = stack.pop();
}
return String.valueOf(result);
}
150. 逆波兰表达式求值
分析:整个过程就是,遇见计算符号就弹出两个元素进行相应运算,再将结果压入栈中,最终栈中剩余的元素就是答案。
代码:
public int evalRPN(String[] tokens) {
Deque<String> stack = new LinkedList<>();
for(int i = 0; i < tokens.length; i++){
if(tokens[i].equals("+")){
int nums1 = Integer.parseInt(stack.pop());
int nums2 = Integer.parseInt(stack.pop());
int nums3 = nums1 + nums2;
stack.push(String.valueOf(nums3));
}else if(tokens[i].equals("-")){
int nums1 = Integer.parseInt(stack.pop());
int nums2 = Integer.parseInt(stack.pop());
int nums3 = nums2 - nums1;
stack.push(String.valueOf(nums3));
}else if(tokens[i].equals("/")){
int nums1 = Integer.parseInt(stack.pop());
int nums2 = Integer.parseInt(stack.pop());
int nums3 = nums2 / nums1;
stack.push(String.valueOf(nums3));
}else if(tokens[i].equals("*")){
int nums1 = Integer.parseInt(stack.pop());
int nums2 = Integer.parseInt(stack.pop());
int nums3 = nums2 * nums1;
stack.push(String.valueOf(nums3));
}else{
stack.push(tokens[i]);
}
}
return Integer.parseInt(stack.pop());
}