Java解析字符串中的括号

引言

在日常的编程中,我们经常会遇到需要解析字符串中的括号的情况。比如,我们需要判断一个表达式中的括号是否匹配,或者需要将一个包含括号的字符串拆分成多个子串。在Java中,我们可以使用栈来解析字符串中的括号。

本文将介绍使用Java解析字符串中的括号的常用方法,并通过代码示例详细说明。

栈的基本概念

在解析字符串中的括号之前,我们先介绍一下栈的基本概念。栈是一种数据结构,它的特点是后进先出(Last-In-First-Out,简称LIFO)。栈可以用来保存一组数据,并且只能在一端插入和删除元素。

栈有两个基本操作:

  1. 入栈(Push):将一个元素插入栈的顶部。
  2. 出栈(Pop):从栈的顶部删除一个元素。

在Java中,我们可以使用java.util.Stack类来实现栈的功能。

解析字符串中的括号

方法一:使用栈判断括号是否匹配

首先,我们来看一个常见的问题:判断一个字符串中的括号是否匹配。例如,对于字符串"((()))",括号是匹配的;而对于字符串"((())",括号是不匹配的。

我们可以使用栈来解决这个问题。遍历字符串的每一个字符,如果遇到左括号(例如(),则将其入栈;如果遇到右括号(例如)),则将栈顶的左括号出栈。如果遍历完字符串后,栈为空,则说明括号是匹配的;如果栈不为空,则说明括号是不匹配的。

下面是使用Java实现的判断括号是否匹配的代码示例:

import java.util.Stack;

public class BracketMatching {
    public static boolean isBracketMatching(String str) {
        Stack<Character> stack = new Stack<>();

        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            
            if (c == '(') {
                stack.push(c);
            } else if (c == ')') {
                if (stack.isEmpty()) {
                    return false;
                }
                stack.pop();
            }
        }

        return stack.isEmpty();
    }

    public static void main(String[] args) {
        String str1 = "((()))";
        String str2 = "((())";

        System.out.println(isBracketMatching(str1)); // 输出:true
        System.out.println(isBracketMatching(str2)); // 输出:false
    }
}

方法二:使用栈拆分包含括号的字符串

有时候,我们需要将一个包含括号的字符串拆分成多个子串,使得每个子串都是一个完整的括号表达式。例如,对于字符串"(a(b)c)(de)",我们可以将其拆分成"(a(b)c)""(de)"

我们可以使用栈来解决这个问题。遍历字符串的每一个字符,如果遇到左括号,则将其入栈,并记录下入栈的位置;如果遇到右括号,则将栈顶的左括号出栈,并根据出栈的位置,将原字符串拆分成两个子串。重复这个过程,直到遍历完整个字符串。

下面是使用Java实现的拆分包含括号的字符串的代码示例:

import java.util.Stack;

public class BracketSplitting {
    public static String[] splitBracketString(String str) {
        Stack<Integer> stack = new Stack<>();
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);

            if (c == '(') {
                stack.push(i);
            } else if (c == ')') {
                int start = stack.pop();
                String subStr = str.substring(start, i + 1);
                sb.append(subStr).append(",");
            }
        }

        return sb.toString().split(",");
    }

    public static void main(String[] args) {
        String str = "(a(b)c)(de)";
        String[] subStrings = splitBracketString(str);

        for (