题目:给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。
题目分析:进行括号匹配一般是使用栈来进行解决的,我们思考如下匹配的情况,“[[[(({{}}))]]]”,我们可以发现,右括号一定与最近的未匹配的左括号相匹配。因此我们首先设定一个栈,这个栈用来存放左括号,当是左括号的时候直接入栈,当是右括号时判断与栈顶元素是否匹配,如果匹配栈顶元素出栈,否则返回错误。 执行流程
- 创建一个栈用来存放左括号,同时将输入序列转换为字符数组;
- 遍历字符数组
- 判断输入字符是不是左括号,如果是直接入栈
- 如果不是左括号,先判断栈是不是空的,避免"]"这种极端情况;如果是空,直接返回false;
- 判断栈顶元素也就是左括号和当前右括号高是否匹配。这里通过ASCII码进行的计算,如果匹配弹出栈顶元素,不匹配则直接返回false;
- 循环执行完毕判断栈中是否还有元素,还有元素返回false,避免全是左括号的情况。
class Test {
public static boolean isValid (String s) {
Stack<Character> stack = new Stack<>(); //创建一个栈用来作为辅助
char[] charArray = s.toCharArray(); //将字符串转换为字符数组
for (char c : charArray) {
if (c == '[' || c == '{' || c == '(') //如果是左边的括号,直接入栈
stack.push(c);
//如果是右闭括号
else if(stack.isEmpty())
return false;
else {
if (stack.peek() + 1 == c || stack.peek() + 2 == c) {
stack.pop();
} else {
return false;
}
}
}
return stack.isEmpty();
}