20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}"
输出: true
class Solution {public boolean isValid(String s) {//判断字符串的长度//isEmpty() 分配了内存空间,值为空,是绝对的空,是一种有值(值 = 空)//"" 分配了内存空间,值为空字符串,是相对的空,是一种有值(值 = 空字串)//null 是未分配内存空间,无值,是一种无值(值不存在)if(s == null){return false;}if(s.isEmpty()){return true;}//先进后出,使用栈//boolean empty() : 测试堆栈是否为空。//Object peek( ) : 查看堆栈顶部的对象,但不从堆栈中移除它。//Object pop( ) : 移除堆栈顶部的对象,并作为此函数的值返回该对象。//Object push(Object element) : 把项压入堆栈顶部。//int search(Object element) : 返回对象在堆栈中的位置,以 1 为基数。Stack<Character> stack = new Stack<Character>();//遍历字符串/*for(int i=0;i < str.length();i++) {System.out.println(str.charAt(i)); }*//*for(int i=0;i < str.length();i++) {System.out.println(str.substring(i,i+1)); }*///无序列表 有序列表根据出现的左括号依次将对应的右括号入栈。//无序列表 有序列表stack.empty() 为true即确定有非指定的括号。所以不符合,return false;//无序列表c!=stack.pop()为true即确定右括号闭合出错。所以不符合,return false;//无序列表stack.pop() 这个语句会根据s中的右括号而多次执行执行取出栈顶元素,顺利的话,最后stack.empty为空则true。char[] c = s.toCharArray();for(int i = 0;i < c.length;i++) {//判断字符并压栈if(c[i] == '('){stack.push(')');}else if(c[i] == '{'){stack.push('}');}else if(c[i] == '['){stack.push(']');}else if(stack.empty() || c[i] != stack.pop()){return false;}}return stack.empty();}
}