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