leetcode_20.有效的括号Java代码实现(栈的巧妙应用):
1.规则:
leetcode--20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效,有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
输入:s = "()" 输出:true 输入:s = "()[]{}" 输出:true 输入:s = "(]" 输出:false 输入:s = "([)]" 输出:false 输入:s = "{[]}" 输出:true
2.思路:
- 顺序读取字符串,如果读到左括号,就将该位置的字符入栈,如果读取到右括号则出栈(如果一开始就读取到右括号,则视为不合法),
- 将读取到的字符和出栈字符进行组合,如果符合(),{},[]则视为合法,否则返回false。
- 直到将整个字符串读取完毕,如果此时栈中有元素则代表该字符串不合法,否则即是合法。
3.代码实现(java)
注:此处代码实现涉及到用栈这种数据结构,而栈分为两种,底层以数组实现的称之为顺序栈,底层以链表实现的称之为链式栈。此处用的是链式栈(顺序栈规定了数组大小,故而需要动态扩容)
package 栈的实现;
import java.util.HashMap;
import java.util.Map;
/**
* 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
* 有效字符串需满足:
* 左括号必须用相同类型的右括号闭合。
* 左括号必须以正确的顺序闭合。
* @author lidadiao
*
*/
public class YouXiaoKH {
//链式栈数据结构
private class StackShiX_LS {
//链表顺序结构 定义内部类 方便链式栈使用
private class LinkNode {
public String val;
public LinkNode next;
}
//栈中元素的个数
private int count;
//栈的大小 链式栈可以不设定栈得大小 因为理论上可以无限大 只要计算机内存足够
private LinkNode current;
public StackShiX_LS() {
super();
this.count = 0;
}
//入栈
public boolean push(String node){
try {
LinkNode newNode = new LinkNode();
newNode.val = node;
newNode.next = current;
count ++;
current = newNode;
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
//出栈
public String pop(){
if(count == 0){
return null;
}
count --;
LinkNode oldNode = current;
current = current.next;
return oldNode.val;
}
//返回栈中元素的数量
public int getSize(){
return count;
}
}
//测试用例
public static void main(String[] args) {
System.out.println(new YouXiaoKH().isValid("{[]}")); //true
}
public boolean isValid(String s) {
int len = s.length();
if(len <= 0){
return false;
}
//申请一个栈空间 用来存放检入的字符
StackShiX_LS stackShiX_LS = new StackShiX_LS();
Map<String,Integer> paramMap = new HashMap<String, Integer>();
paramMap.put("(", -1);
paramMap.put("{", -2);
paramMap.put("[", -3);
paramMap.put(")", 1);
paramMap.put("}", 2);
paramMap.put("]", 3);
for(int i = 0; i < len; i++){
String tempStr = s.charAt(i) + "";
//如果是左括号 那么就进栈 否则就出栈
if(judgeIsRight(tempStr)){
String popStr = stackShiX_LS.pop();
if(popStr == null){
return false;
}
if(paramMap.get(tempStr) + paramMap.get(popStr) != 0){
return false;
}
//if(paramMap.get(te))
} else {
stackShiX_LS.push(tempStr);
}
}
//如果遍历完整个数组 栈为空 则代表是合法得括号
if(stackShiX_LS.count == 0){
return true;
}
return false;
}
/**
* 判断是否为右括号
* @param tempStr 需要判断的字符
* @return 如果是右括号则返回true 否则else
*/
private boolean judgeIsRight(String tempStr) {
if(tempStr.equals(")") || tempStr.equals("}") || tempStr.equals("]")){
return true;
}
return false;
}
}