代码随想录算法训练营Day11
20. 有效的括号
class Solution {
public boolean isValid(String s) {
// 创建一个栈来存储括号
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
// 如果是左括号,就入栈
if (c == '(' || c == '{' || c == '[') {
stack.push(c);
} else {
// 如果栈为空且遇到右括号,直接返回 false
if (stack.isEmpty()) {
return false;
}
// 取出栈顶元素
char top = stack.pop();
// 判断当前右括号和栈顶左括号是否匹配
if ((c == ')' && top!= '(') || (c == '}' && top!= '{') || (c == ']' && top!= '[')) {
return false;
}
}
}
// 最后如果栈为空,说明括号都匹配,返回 true
return stack.isEmpty();
}
}
1047. 删除字符串中的所有相邻重复项
class Solution {
public String removeDuplicates(String s) {
// 创建一个栈来存储字符
Stack<Character> stack = new Stack<>();
// 遍历输入字符串的每个字符
for (char c : s.toCharArray()) {
// 如果栈不为空且当前字符与栈顶字符相同
if (!stack.isEmpty() && stack.peek() == c) {
// 则弹出栈顶字符,实现去除相邻重复字符
stack.pop();
} else {
// 否则,说明当前字符与栈顶字符不同,将其入栈
stack.push(c);
}
}
// 创建一个 StringBuilder 来构建结果字符串
StringBuilder result = new StringBuilder();
// 遍历栈中的所有字符
for (char c : stack) {
// 将栈中的字符依次添加到 StringBuilder 中
result.append(c);
}
// 返回构建好的结果字符串
return result.toString();
}
}
150. 逆波兰表达式求值
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();
}
}