括号匹配问题
假设表达式中允许包含两种括号:圆括号和方括号,其嵌套顺序随意,及([]())或[([][])]等均为正确的格式,[(])或([())或(()]均为不正确的格式。
匹配算法的思想是:
首先将第一个括号压入栈,然后从第二个括号开始,如果与栈顶元素能匹配,能将栈顶元素弹出;如果不匹配,则将该元素压入栈中。
当带匹配字符串遍历结束后,检查栈是否为空,为空则表示匹配成功了,如果非空则表示还有括号未能匹配,即该字符串匹配失败。
具体代码:
- package ds.linerlist;
- 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;
- /**
- * 使用栈实现字符串的括号匹配检查。
- * @author <a href="mailto:bao.yiming@live.cn" mce_href="mailto:bao.yiming@live.cn">Bao Yiming</a>
- */
- public class BracketMatch {
- /**
- * 进行匹配的算法。
- * @param str 待检查的字符串。
- * @return
- */
- public static boolean match(String str) {
- Stack stack = new Stack(); // 定义一个存放括号的栈。
- char[] ca = str.toCharArray(); // 将字符串转为字符数组以便对其遍历。
- stack.push((Character) ca[0]); // 首先将第一个字符压入栈中。
- /*
- * 从第二个字符开始,依次与栈中字符匹配。
- * 成功则将栈顶元素弹出。
- * 失败则将字符数组中的当前字符压入栈中。
- */
- for (int index = 1; index < ca.length; ++index) {
- Character c1 = (Character) stack.peek();
- Character c2 = ca[index];
- if ((c1.equals('(') && c2.equals(')'))
- || (c1.equals('[') && c2.equals(']'))) {
- stack.pop();
- } else {
- stack.push(c2);
- }
- }
- return stack.empty();
- }
- }
描述现在,有一行括号序列,请你检查这行括号是否配对。
- 输入
- 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
- 输出
- 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
- 样例输入
-
3 [(]) (]) ([[]()])
样例输出
No No Yes
- import java.util.Scanner;
- import java.util.Stack;
- /**
- * @author Owner
- *
- */
- public class Main {
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- int n= sc.nextInt();//3条测试数据数据
- Stack<Character> stack = null;
- while(n!=0){
- //从控制台读入一个测试字符串[]() [(])
- String str = sc.next();
- //如果该输入字符串为奇数,说明不匹配
- if(str.length() % 2 == 1){
- System.out.println("No");
- }else{
- //说明字符是偶数
- stack = new Stack<Character>();
- //遍历第一条测试字符串[]() [(])
- for(int i=0;i<str.length();i++){
- if(stack.isEmpty()){
- //如果栈是空的
- stack.push(str.charAt(i));
- }else if(stack.peek() == '[' && str.charAt(i) == ']' || stack.peek() == '(' && str.charAt(i) == ')'){
- //说明此时栈中字符不是空的,并且符合,
- stack.pop();
- }else{
- stack.push(str.charAt(i));
- }
- }
- if(stack.isEmpty()){
- //如果栈是空的,说明括号匹配
- System.out.println("Yes");
- }else{
- //说明栈不为空,括号不匹配
- System.out.println("No");
- }
- }
- n--;
- }
- }
Don't Repeat Yourself !