天天看点

括号序列 Scala题解 附Java代码

括号序列

题目描述:给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。
**示例1**
输入
"["
返回值
false
**示例2**
输入
"[]"
返回值
true
           

scala题解

def isValid(s:String): Boolean ={
    //定义一个栈
    val stack = mutable.Stack[Character]()
    //遍历括号序列
    for(index<-0 to s.length-1){
      //当前位置的字符
      val ch = s.charAt(index)
      //如果是空栈的话,不需要判断,直接入栈即可
      if(stack.isEmpty){
        stack.push(ch)
      }else{
        //取出栈顶元素
        val peek = stack.head
        //如果栈顶元素和当前位置的括号能成为一个组合,那么将栈顶元素消掉
        if((peek=='('&&ch==')'||(peek=='['&&ch==']')||(peek=='{'&&ch=='}'))){
          stack.pop
        }else if(ch==']'||ch=='}'||ch==')'){
          //如果栈顶元素和当前元素不能构成一个组合,而且当前元素是右括号,那么该括号序列不成立
          return false
        }else{
          //该情况是括号嵌套,左括号之前没有右括号,可以直接入栈
          stack.push(ch)
        }
      }
    }
    //如果该栈元素都被消除掉,当前栈为空,为符合的括号序列
    stack.isEmpty
  }
           

随带附个Java代码:

public boolean isValid (String s) {
    Stack<Character> stack = new Stack<>();
    for(int i=0;i<s.length();i++){
      char ch = s.charAt(i);
      if(!stack.isEmpty()){
        char top = stack.peek();
        if((top=='('&&ch==')')||(top=='{'&&ch=='}')||(top=='['&&ch==']'))
          stack.pop();
        else if(ch==')'||ch==']'||ch=='}')
          return false;
        else stack.push(ch);
      }else{
        stack.push(ch);
      }
    }
    return stack.isEmpty();
  }