java校验括号是否成对匹配

论坛 期权论坛 脚本     
匿名网站用户   2020-12-21 05:17   635   0
public class BracketsCheckTest {

 public static void main(String[] args) {
  System.out.println(bracketsCheck("a((()){khgg{[]sdfg}gdfg}"));
  System.out.println(bracketsCheck("}a((()){khgg{[]sdfg}gdfg}"));
  System.out.println(bracketsCheck("a}((()){khgg{[]sdfg}gdfg}"));
  System.out.println(bracketsCheck("a("));
 }
 
 /**
  * 校验括号是否成对匹配
  * 
  * 返回-1为正常,其余数字代表错误位置,从零开始索引
  * 
  * @date 2018年11月22日 上午10:54:50
  * @param checkedStr
  * @return
  */
 public static Integer bracketsCheck(String checkedStr) {
  Stack<Character> bracketsStack = new Stack<>();
  char[] chedkedCharArray = checkedStr.toCharArray();
  
  for (int i = 0; i < chedkedCharArray.length; i++) {
   char c = chedkedCharArray[i];
   
   // 左括号都压入栈顶,右括号进行比对
   if(c == '(' || c == '[' || c == '{') {
    bracketsStack.push(c);
   } else if(c == ')') {
    // 栈非空校验,防止首先出现的是右括号
    if(bracketsStack.isEmpty()) {
     return i;
    }
    Character popChar = bracketsStack.pop();
    if('(' != popChar) {
     return i;
    }
   } else if(c == ']') {
    if(bracketsStack.isEmpty()) {
     return i;
    }
    Character popChar = bracketsStack.pop();
    if('[' != popChar) {
     return i;
    }
   } else if(c == '}') {
    if(bracketsStack.isEmpty()) {
     return i;
    }
    Character popChar = bracketsStack.pop();
    if('{' != popChar) {
     return i;
    }
   }
  }
  
  // 结束后栈内为空则正常,否则返回字符串全长+1,表示有括号未结束
  if(bracketsStack.isEmpty()) {
   return -1;
  } else {
   return checkedStr.length() + 1;
  }
 }
}
执行结果
25
0
1
3

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP