Java算法栈

栈作为编程中一个常见的算法,以下是它的特征以及一个相对应的例子:

在编程中,**栈(Stack)**是一种后进先出(LIFO, Last In First Out)数据结构。它的特性是:

  1. 入栈(Push):将元素添加到栈顶。
  2. 出栈(Pop):将栈顶元素移除。
  3. 查看栈顶元素(Peek/Top):获取栈顶元素但不移除。

Java 提供了一个现成的 Stack 类,它是 java.util 包的一部分,可以直接用于算法问题中。

算法栈的特点和应用

算法栈主要应用于:

  1. 表达式求值(如括号匹配、后缀表达式)。
  2. 回溯算法(如深度优先搜索)。
  3. 状态管理(如递归调用模拟)。
  4. 栈结构的模拟(如梦境题中的层级关系)。

例题:括号匹配问题

题目描述: 给定一个只包含 () 的字符串,判断字符串中的括号是否是有效的。

有效的括号需满足:

  1. 左括号必须有相应的右括号。
  2. 左括号的顺序必须与右括号的顺序匹配。

例如:

  • 输入:"()",输出:true
  • 输入:"(()",输出:false
  • 输入:"(())",输出:true

解题思路

我们可以用栈来解决括号匹配问题:

  1. 遍历字符串:
    • 遇到左括号 ( 时,将其压入栈。
    • 遇到右括号 ) 时:
      • 如果栈为空,说明没有匹配的左括号,返回 false
      • 否则弹出栈顶元素,与当前右括号匹配。
  2. 遍历结束后,如果栈为空,则括号匹配;否则不匹配。

代码如下:

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

算法栈的作用总结

在本例中,栈的作用是:

  1. 保存未匹配的左括号。
  2. 确保括号按照正确的顺序匹配。
  3. 在所有括号处理完后,确保栈为空以确认完全匹配。

栈作为一种简单高效的工具,可以方便地解决这类匹配、递归和状态管理问题,是算法中的重要数据结构之一。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王景程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值