力扣20:有效的括号
题目链接:力扣20:有效的括号
思路:
1.定义一个栈,用来存放右括号
2.遍历字符串中的元素,如果为左括号,则往栈中添加对应的右括号;如果为右括号,则跟栈顶元素进行匹配
代码:
class Solution {
public boolean isValid(String s) {
// 1.定义一个栈,用来存放右括号
Stack<Character> stack = new Stack<>();
// 校验字符串长度,如果不为偶数则返回false
if (s.length() > 0 && (s.length() % 2) != 0) {
return false;
}
// 2.遍历字符串中的元素,如果为左括号,则往栈中添加对应的右括号;如果为右括号,则跟栈顶元素进行匹配
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
stack.push(')');
} else if (s.charAt(i) == '{') {
stack.push('}');
} else if (s.charAt(i) == '[') {
stack.push(']');
} else {
if (stack.isEmpty() || s.charAt(i) != stack.peek()) {
return false;
}
stack.pop();
}
}
return stack.isEmpty();
}
}
力扣1047:删除字符串中的所有相邻重复项
题目链接:力扣1047:删除字符串中的所有相邻重复项
思路:
1.该题涉及到匹配规则,所以来定义一个栈
2.遍历每个元素,如果栈为空或者当前元素不等于栈顶元素,则直接入栈;否则弹出栈顶元素
代码:
class Solution {
public String removeDuplicates(String s) {
// 1.该题涉及到匹配规则,所以来定义一个栈
Stack<Character> stack = new Stack<>();
// 2.遍历每个元素
for (int i = 0; i < s.length(); i++) {
// 3.如果栈为空或者当前元素不等于栈顶元素,则直接入栈;否则弹出栈顶元素
if (stack.isEmpty() || s.charAt(i) != stack.peek()) {
stack.push(s.charAt(i));
} else {
stack.pop();
}
}
String str = "";
while (!stack.isEmpty()) {
str = stack.pop() + str;
}
return str;
}
}
力扣150:逆波兰表达式求值
题目链接:力扣150:逆波兰表达式求值
思路:
1.定义一个栈,用于存放数字
2.遍历元素,如果是数字,则直接入栈;如果遇到操作符,则取出栈顶前两个元素做对应的运算
3.返回栈顶元素
代码:
class Solution {
public int evalRPN(String[] tokens) {
// 1.定义一个栈,用于存放数字
Stack<Integer> stack = new Stack<>();
// 2.遍历元素,如果是数字,则直接入栈;如果遇到操作符,则取出栈顶前两个元素做对应的运算
for (int i = 0; i < tokens.length; i++) {
System.out.println(tokens[i]);
if("+".equals(tokens[i]) || "-".equals(tokens[i]) || "*".equals(tokens[i]) || "/".equals(tokens[i])) {
Integer num1 = Integer.valueOf(stack.pop());
Integer num2 = Integer.valueOf(stack.pop());
if ("+".equals(tokens[i])) {
stack.push(num1 + num2);
}
if ("-".equals(tokens[i])) {
stack.push(num2 - num1);
}
if ("*".equals(tokens[i])) {
stack.push(num1 * num2);
}
if ("/".equals(tokens[i])) {
stack.push(num2 / num1);
}
} else {
stack.push(Integer.valueOf(tokens[i]));
}
}
// 3.返回栈顶元素
return stack.pop();
}
}