题意:确定一个包含大中小括号的字符串的括号是否都以正确的顺序闭合。
初步分析:
1.这个在学数据结构的时候,是一个很经典的栈的应用。大概就是遇到左括号就放入栈中,遇到右括号,就从栈中弹出栈顶的元素,比较如果不等则代表匹配失败,结束。最后,要看栈是否为空,如果不为空,也是匹配失败的。所以,要想匹配成功,就需要每一次括号都和栈顶弹出的左括号匹配。而且最后栈为空。
基本结构:
while -> if(是左括号)
-> else if(右括号)
if(栈为空)...
2.思路是比较简单的,但是,怎样让实现也比较简单呢?
对于循环:我们把string 转化为 char[] 让后遍历这个数组
对于判断左右括号:String有 charAt 方法 和 indexOf 这就有了一个很好的方法(相当于列表查表)
对于栈的模拟:关键是出栈,入栈,判断栈顶所在位置,这里采用stringBuilder 的append deleteCharAt charAt
也就充分说明栈是可以模拟的了。
现在我们开始:
public class Solution {
public boolean isValid(String s) {
String str = "(){}[]";
char[] arr = s.toCharArray();
StringBuilder stack = new StringBuilder();
for(char c : arr)
{
int index = str.indexOf(c);
if(index%2 == 0) //左括号放入栈
stack.append(c);
else{ //右括号从栈顶取出并且比较,注意之前判断栈不为空(否则可能会空指针)
if(stack.length() != 0 && stack.charAt(stack.length() - 1) == str.charAt(index - 1))
stack.deleteCharAt(stack.length() - 1);
else
return false;
}
}
return stack.length() == 0; //最后栈为空才行
}
}