1、问题描述
给出一个仅包含字符’(‘,’)‘,’{‘,’}‘,’[‘和’]',的字符串,判断给出的字符串是否是合法的括号序列。
括号必须以正确的顺序关闭,"()“和”()[]{}“都是合法的括号序列,但”(]“和”([)]"不合法。
2、解题思路
借助辅助栈——左括号入栈
1、当遍历遇到字符左括号: ‘(’、 ‘[’ 或 ‘{’ 时,将左括号入栈;
2、当遍历遇到字符右括号 :‘)’ 、‘[’ 或 ‘}’ 时,则判断该字符是否与当前的栈顶元素相同:如果不同则直接返回false,终止遍历;如果相同则将当前的栈顶元素出栈。
3、当遍历结束时,判断栈是否为空:如果栈空则表示括号序列合法;否则表示括号序列不合法。
3、图解
4、代码实现
/**
*
* @param s string字符串
* @return bool布尔型
*/
public boolean isValid (String s) {
// write code here
Stack<Character> st = new Stack<>();
//System.out.println(s.length());
for(int i = 0; i < s.length(); i++){
char x = s.charAt(i);
//遇见左括号进栈
if(x == '(' || x == '[' || x == '{'){
st.push(x);
System.out.println(x + "进栈");
}
//遇见右括号判断栈空和栈顶元素是否与此右括号匹配
else if(!st.empty() && ((x == ')' && '(' == st.peek())
|| (x == ']' && '[' == st.peek())
|| (x == '}' && '{' == st.peek()))){
//如果匹配则出栈
st.pop();
System.out.println(x + "出栈");
}
//不匹配则直接终止遍历,返回false
else
return false;
}
//最后如果栈空则表示匹配
return st.empty();
}