栈作为编程中一个常见的算法,以下是它的特征以及一个相对应的例子:
在编程中,**栈(Stack)**是一种后进先出(LIFO, Last In First Out)数据结构。它的特性是:
- 入栈(Push):将元素添加到栈顶。
- 出栈(Pop):将栈顶元素移除。
- 查看栈顶元素(Peek/Top):获取栈顶元素但不移除。
Java 提供了一个现成的 Stack
类,它是 java.util
包的一部分,可以直接用于算法问题中。
算法栈的特点和应用
算法栈主要应用于:
- 表达式求值(如括号匹配、后缀表达式)。
- 回溯算法(如深度优先搜索)。
- 状态管理(如递归调用模拟)。
- 栈结构的模拟(如梦境题中的层级关系)。
例题:括号匹配问题
题目描述: 给定一个只包含 (
和 )
的字符串,判断字符串中的括号是否是有效的。
有效的括号需满足:
- 左括号必须有相应的右括号。
- 左括号的顺序必须与右括号的顺序匹配。
例如:
- 输入:
"()"
,输出:true
- 输入:
"(()"
,输出:false
- 输入:
"(())"
,输出:true
解题思路
我们可以用栈来解决括号匹配问题:
- 遍历字符串:
- 遇到左括号
(
时,将其压入栈。 - 遇到右括号
)
时:- 如果栈为空,说明没有匹配的左括号,返回
false
。 - 否则弹出栈顶元素,与当前右括号匹配。
- 如果栈为空,说明没有匹配的左括号,返回
- 遇到左括号
- 遍历结束后,如果栈为空,则括号匹配;否则不匹配。
代码如下:
import java.util.Stack;
public class BracketMatching {
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
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 test1 = "()";
String test2 = "(()";
String test3 = "(())";
String test4 = "())(";
System.out.println(isValid(test1)); // 输出: true
System.out.println(isValid(test2)); // 输出: false
System.out.println(isValid(test3)); // 输出: true
System.out.println(isValid(test4)); // 输出: false
}
}
运行结果
运行以上代码后:
true
false
true
false
算法栈的作用总结
在本例中,栈的作用是:
- 保存未匹配的左括号。
- 确保括号按照正确的顺序匹配。
- 在所有括号处理完后,确保栈为空以确认完全匹配。
栈作为一种简单高效的工具,可以方便地解决这类匹配、递归和状态管理问题,是算法中的重要数据结构之一。