括号匹配问题

假设表达式中允许包含两种括号:圆括号和方括号,其嵌套顺序随意,及([]())或[([][])]等均为正确的格式,[(])或([())或(()]均为不正确的格式。

匹配算法的思想是:

首先将第一个括号压入栈,然后从第二个括号开始,如果与栈顶元素能匹配,能将栈顶元素弹出;如果不匹配,则将该元素压入栈中。

当带匹配字符串遍历结束后,检查栈是否为空,为空则表示匹配成功了,如果非空则表示还有括号未能匹配,即该字符串匹配失败。

具体代码:

[java] view plain copy
 
  1. package ds.linerlist;  
  2. import <a href="http://lib.csdn.net/base/javase" class='replace_word' title="Java SE知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Java</a>.util.Stack;  
  3. /** 
  4.  * 使用栈实现字符串的括号匹配检查。 
  5.  * @author <a href="mailto:bao.yiming@live.cn" mce_href="mailto:bao.yiming@live.cn">Bao Yiming</a> 
  6.  */  
  7. public class BracketMatch {  
  8.     /** 
  9.      * 进行匹配的算法。 
  10.      * @param str 待检查的字符串。 
  11.      * @return 
  12.      */  
  13.     public static boolean match(String str) {  
  14.         Stack stack = new Stack(); // 定义一个存放括号的栈。  
  15.         char[] ca = str.toCharArray(); // 将字符串转为字符数组以便对其遍历。  
  16.         stack.push((Character) ca[0]); // 首先将第一个字符压入栈中。  
  17.         /* 
  18.          * 从第二个字符开始,依次与栈中字符匹配。 
  19.          * 成功则将栈顶元素弹出。 
  20.          * 失败则将字符数组中的当前字符压入栈中。 
  21.          */  
  22.         for (int index = 1; index < ca.length; ++index) {  
  23.             Character c1 = (Character) stack.peek();  
  24.             Character c2 = ca[index];  
  25.             if ((c1.equals('(') && c2.equals(')'))  
  26.                     || (c1.equals('[') && c2.equals(']'))) {  
  27.                 stack.pop();  
  28.             } else {  
  29.                 stack.push(c2);  
  30.             }  
  31.         }  
  32.         return stack.empty();  
  33.     }  
  34. }  
 
 

描述现在,有一行括号序列,请你检查这行括号是否配对。

 
输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])

样例输出

No
No
Yes

[java] view plain copy
 
  1. import java.util.Scanner;  
  2. import java.util.Stack;  
  3.   
  4. /** 
  5.  * @author Owner 
  6.  *  
  7.  */  
  8. public class Main {  
  9.   
  10.     public static void main(String[] args) {  
  11.         Scanner sc = new Scanner(System.in);  
  12.           
  13.         int n= sc.nextInt();//3条测试数据数据  
  14.           
  15.         Stack<Character> stack = null;  
  16.           
  17.         while(n!=0){  
  18.               
  19.             //从控制台读入一个测试字符串[]() [(])  
  20.             String str = sc.next();  
  21.             //如果该输入字符串为奇数,说明不匹配  
  22.             if(str.length() % 2 == 1){  
  23.                 System.out.println("No");  
  24.             }else{  
  25.                 //说明字符是偶数  
  26.                 stack = new Stack<Character>();  
  27.                   
  28.                 //遍历第一条测试字符串[]() [(])  
  29.                 for(int i=0;i<str.length();i++){  
  30.                     if(stack.isEmpty()){  
  31.                         //如果栈是空的  
  32.                         stack.push(str.charAt(i));  
  33.                     }else if(stack.peek() == '[' && str.charAt(i) == ']' || stack.peek() == '(' && str.charAt(i) == ')'){  
  34.                         //说明此时栈中字符不是空的,并且符合,  
  35.                         stack.pop();  
  36.                     }else{  
  37.                           
  38.                         stack.push(str.charAt(i));  
  39.                     }  
  40.                 }  
  41.                   
  42.                 if(stack.isEmpty()){  
  43.                     //如果栈是空的,说明括号匹配  
  44.                     System.out.println("Yes");  
  45.                 }else{  
  46.                     //说明栈不为空,括号不匹配  
  47.                     System.out.println("No");  
  48.                 }  
  49.             }  
  50.               
  51.             n--;  
  52.         }  
  53.           
  54.     }   
原文地址:https://www.cnblogs.com/qiaoyanlin/p/6877548.html