📜  使用堆栈的分隔符匹配 (1)

📅  最后修改于: 2023-12-03 15:36:38.969000             🧑  作者: Mango

使用堆栈的分隔符匹配

分隔符匹配是一个经典的问题,可以用堆栈来解决。堆栈数据结构是LIFO(后进先出)的结构,特别适用于分隔符匹配问题。

什么是分隔符匹配?

就是匹配一段字符串中的各种分隔符是否匹配,例如圆括号、方括号和花括号等。

例如以下字符串:

a{b(c[d]e)f}g

其中,花括号、圆括号和方括号可以匹配,因为每个左括号都有与之对应的右括号。

解决方法

我们可以使用堆栈来解决:

  1. 遍历字符串中的每个字符。
  2. 如果这个字符是分隔符的左半部分,则将其压入堆栈中。
  3. 如果这个字符是分隔符的右半部分,则取出堆栈顶部的字符进行比较:
    1. 如果匹配,则将堆栈顶部的字符弹出。
    2. 如果不匹配,则表示分隔符不匹配,直接返回false。
  4. 如果遍历结束后,堆栈还有元素,则表示分隔符不匹配,直接返回false。
  5. 如果遍历结束后,堆栈为空,则表示分隔符匹配,返回true。

以下是Java实现的代码片段:

public static boolean isDelimiterMatched(String s) {
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (c == '{' || c == '[' || c == '(') {
            stack.push(c);
        } else if (c == '}' || c == ']' || c == ')') {
            if (stack.isEmpty()) {
                return false;
            }
            char top = stack.pop();
            if (c == '}' && top != '{' || c == ']' && top != '[' || c == ')' && top != '(') {
                return false;
            }
        }
    }
    return stack.isEmpty();
}

这个函数接受一个字符串作为参数,返回一个布尔值来表示分隔符是否匹配。

总结

堆栈是解决分隔符匹配问题的有效数据结构。使用堆栈可以方便地解决这个问题,代码实现也比较简单,容易理解。