【简单】 LeetCode: 20.有效的括号
今天刷了一个 LeetCode 题目,就是简单的括号匹配题目,之前用数组做过一次,这次用栈来做一下。体会一下栈的使用方法。
首先我们要知道栈的特征:后进先出,我个人喜欢把它比作一个只有一边开口的玻璃管。因为只有一端开口,所以每次从玻璃管内取东西都要取出最靠近管口的那个。
我们来看一下题目:
我们可以看到,这个题目的描述有点符合我们刚才所说的栈的特征:我们把所有没有被配对的括号压入栈内,每次压入前都要将栈顶的括号和即将要压入的括号作比较,如果他俩是匹配的,我们就弹出栈顶括号,不过不匹配就将这个元素压入栈中。那如果直到最后一个元素判断完毕,如果栈内是空的,那么就证明我们的字符串是括号匹配的,如果栈内还有元素则说明这个字符串是括号不匹配的。当然了,第一个括号是直接入栈的。接下来我们看看代码:
public boolean isValid(String s) {
//判断是否括号匹配的函数
Stack<Character> stack = new Stack<>();//定义一个栈
char[] a = s.toCharArray();//将字符串转为字符数组
int length = a.length;
if(length %2 !=0)//括号数量是奇数则直接返回不匹配
{
return false;
}
for(char c:a)//逐个取出字符数组的元素
{
if(stack.size()==0)//空栈直接将元素入栈
{
stack.push(c);
}
else if(isOk(stack.peek(),c))//括号匹配就出栈
{
stack.pop();
}
else//不匹配就入栈
{
stack.push(c);
}
}
return stack.size()==0;//返回栈内元素是不是=0
}
private boolean isOk(char a,char b)//判断栈顶元素是不是和即将入栈元素匹配
{
if((a=='('&&b==')') ||(a=='{'&&b=='}') || (a=='['&&b==']') )
{
return true;
}
return false;
}
就是这样,一个简单的题目。不知道转载LeetCode的题目会不会侵权,如有侵权请联系我删除,有大佬有优化的方法也请不吝赐教。