zoukankan      html  css  js  c++  java
  • 括号匹配问题

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

    匹配算法的思想是:

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

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

    具体代码:

    [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.     }   
  • 相关阅读:
    JavaScript&DOM
    avalon.js的循环操作在表格中的应用
    merge()
    建立表空间以及用户
    SSI框架下,用jxl实现导出功能
    SQL递归查询实现组织机构树
    vue+webpack实践
    使用canvas绘制一片星空
    在canvas中使用html元素
    CSS3-transform 转换/变换
  • 原文地址:https://www.cnblogs.com/qiaoyanlin/p/6877548.html
Copyright © 2011-2022 走看看