正确理解题意:
每一个左都要和一个右对应 而且是正确顺序如{[()])这种是可以的
但是{[(])}这种就不合法
理解了以后 如果你只单纯判断{}()[]这种肯定是不行的
import java.util.Stack;
class Solution {
public static boolean isValid(String s) {
Stack stack = new Stack();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(' || c == '{' || c == '[') {
stack.push(c);
}else if (c == ')' || c == '}' || c == ']') {
if (stack.isEmpty()) {
return false;
}
stack.push(c);
}
}
while (!stack.isEmpty()) {
if ((char)stack.peek() == ')' || (char)stack.peek() == '}' || (char)stack.peek() == ']') {
char char1 = (char) stack.pop();
if (char1 == ')') {
if ((char)stack.pop() == '('){
}else {
return false;
}
}else if (char1 == '}') {
if ((char)stack.pop() == '{'){
}else {
return false;
}
}else if (char1 == ']') {
if ((char)stack.pop() == '['){
}else {
return false;
}
}
} else {
return false;
}
}
return true;
}
}
这种小丑代码是不行的
正确代码:
import java.util.Stack;
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 {
// 如果是右括号
if (stack.isEmpty()) {
// 如果栈为空,则没有对应的左括号,返回false
return false;
}
// 取出栈顶的左括号
char top = stack.pop();
// 判断右括号是否与栈顶的左括号匹配
if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {
return false;
}
}
}
// 如果栈为空,则所有括号都匹配了,返回true;否则返回false
return stack.isEmpty();
}
}
优雅代码:
又让我学到一个知识点
泛型里是一个类而不是基本类型 所以<char>是不行的就像<int>不行一样他们都是通过封装一个类去实现约束字符或者是整数
<Integer> -int <String> -string <Character> - char
1.这代码就是一次性解决问题 我不管你入栈出栈怎么样 只要你入栈是左放行 但你入栈是右的时候我取出栈顶元素去匹配 如果匹配不成功那就是有问题 从内部解决问题的方式学到了 最后如果留有元素说明false 没元素说明true
2.复习pop出栈 peek取出不出栈 push入栈 isEmpty() 这四个基本的Stack