Java中的字符栈

在Java中,字符栈是一种常见的数据结构,用于存储和操作字符类型的数据。字符栈的特点是后进先出(LIFO)的原则,类似于我们平常使用的弹夹。当我们需要对字符进行操作时,可以使用字符栈来方便地管理和处理数据。

字符栈的实现

在Java中,我们可以使用数组或链表来实现字符栈。下面是使用数组实现字符栈的示例代码:

public class CharStack {
    private char[] stackArray;
    private int top; // 栈顶指针

    public CharStack(int capacity) {
        stackArray = new char[capacity];
        top = -1; // 初始化栈顶指针为-1
    }

    public void push(char c) {
        if (top < stackArray.length - 1) {
            stackArray[++top] = c; // 先将栈顶指针加1,再入栈
        } else {
            System.out.println("Stack is full, cannot push element: " + c);
        }
    }

    public char pop() {
        if (top >= 0) {
            return stackArray[top--]; // 先出栈,再将栈顶指针减1
        } else {
            System.out.println("Stack is empty, cannot pop element.");
            return '\0'; // 返回空字符
        }
    }

    public char peek() {
        if (top >= 0) {
            return stackArray[top]; // 返回栈顶元素
        } else {
            System.out.println("Stack is empty, cannot peek element.");
            return '\0';
        }
    }

    public boolean isEmpty() {
        return top == -1; // 判断栈是否为空
    }

    public int size() {
        return top + 1; // 返回栈的大小
    }
}

上述代码定义了一个CharStack类,通过数组实现了字符栈的基本操作。其中,push方法用于入栈,pop方法用于出栈,peek方法用于查看栈顶元素,isEmpty方法用于判断栈是否为空,size方法用于返回栈的大小。

使用字符栈进行操作

字符栈可以用于多种应用场景,例如括号匹配、后缀表达式计算等。下面以括号匹配为例,演示如何使用字符栈进行操作。

括号匹配

括号匹配是一个经典的应用场景,用于判断给定字符串中的括号是否匹配。例如,对于字符串"({})",括号是匹配的;而对于字符串"()[]}",括号是不匹配的。

我们可以使用字符栈来判断括号是否匹配。遍历字符串的每个字符,当遇到左括号时,将其入栈;当遇到右括号时,与栈顶元素进行匹配。如果匹配成功,继续遍历下一个字符;如果匹配失败,或者遍历完所有字符后栈不为空,说明括号不匹配。

下面是使用字符栈判断括号匹配的示例代码:

import java.util.HashMap;
import java.util.Map;

public class BracketMatching {
    private static final Map<Character, Character> bracketMap = new HashMap<>();

    static {
        bracketMap.put('(', ')');
        bracketMap.put('[', ']');
        bracketMap.put('{', '}');
    }

    public static boolean isBracketMatching(String str) {
        CharStack stack = new CharStack(str.length());

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

            if (bracketMap.containsKey(c)) {
                stack.push(c); // 左括号入栈
            } else if (bracketMap.containsValue(c)) {
                if (stack.isEmpty()) {
                    return false; // 栈为空,右括号不匹配
                }

                char topBracket = stack.pop(); // 出栈栈顶元素

                if (bracketMap.get(topBracket) != c) {
                    return false; // 左右括号不匹配
                }
            }
        }

        return stack.isEmpty(); // 栈为空,括号匹配成功
    }

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