java堆栈类解决括号匹配问题

java.util包中提供了stack这个类,可以利用堆栈解决很多问题,比如经典的括号匹配问题

先看看stack这个类

方法
java堆栈类解决括号匹配问题_第1张图片

例题:

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

3
[(])
(])
([[]()])
样例输出
No
No
Yes

思路:
当匹配到左括号则压栈
匹配到右括号,则和栈顶元素比较,匹配一对则出栈,否则返回No,结束判断
栈空还没匹配完,也返回No,结束判断

package com.day1;

import java.util.Scanner;
import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        String[] arr = new String[n];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = input.next();
        }
        for (String string : arr) {
            System.out.println(isMatch(string));
        }
    }

    private static String isMatch(String str){
        Stack<Character> stack = new Stack<>();//建立栈
        /** * 对字符串逐个扫描 * 遇到左括号入栈,遇到右括号则判断 */
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i)!=')' && str.charAt(i)!=']') {
                stack.push(str.charAt(i));
            }else {
                ///栈空或者不匹配,则返回No
                if (stack.empty() || !isBracketMatch(stack.peek(), str.charAt(i))) {
                    return "No";
                }else {
                    stack.pop();
                }
            }
        }
        return "Yes";
    }
    /** * 判断两个括号是否匹配 * @param c1 * @param c2 * @return */
    private static boolean isBracketMatch(Character c1,Character c2){
        if (c1 == '(' && c2 == ')') {
            return true;
        }
        if (c1 =='[' && c2 ==']') {
            return true;
        }
        return false;
    }
}

你可能感兴趣的:(java)