searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

利用栈的数据结构解决实际问题

2023-10-16 11:09:37
6
0

栈(Stack)是一种常见的数据结构,它具有特定的数据访问方式和操作规则。栈通常采用后进先出(Last-In-First-Out,LIFO)的原则,这意味着最后进栈的元素将首先出栈。

栈通常支持两种基本操作:

  1. 入栈(Push):将数据元素放入栈的顶部。新元素成为栈的最顶部元素,覆盖先前在栈顶的元素。

  2. 出栈(Pop):从栈的顶部移除元素,并返回被移除的元素。这个操作会导致栈的大小减小。

此外,栈还支持以下操作:

  1. 查看栈顶元素(Top):查看栈顶的元素,但不将其移出栈。

  2. 判断栈是否为空:检查栈中是否还有元素。

栈作为一种数据结构,最让人熟知的是在java中函数调用和递归:栈通常用于管理函数调用的堆栈帧。每当一个函数被调用,一个新的堆栈帧被推入栈中,包含了函数的局部变量和返回地址。当函数执行完成时,堆栈帧被弹出。栈也用于递归算法,其中递归函数调用被压入栈中,以便在递归调用返回时能够恢复到之前的状态。

在我们的日常开发中,还可以用栈的结构特点巧妙解决哪些实际问题呢?

判断括号合法性问题

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

例如 "(1{2[3]4}5)"就是正确的,而"{2[3}4]"是错误的,因为在"["未与"]"闭合之前就遇到了"}"。

如果用一般的判断方式,可能需要初始化几个变量,来记录三种括号各自出现的次数,可能还需要其他变量来记录各个括号的闭合状态,不仅编程麻烦还不利于理解阅读。我们来看下如何借助栈的数据结果来解决以上问题。

遍历字符串s的每个字符,当遇到左括号时,将字符放入栈中。当遇到右括号时,弹出栈顶的字符,并判断是否和右括号是同种类型的左括号,最后判断栈是否为空。

    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        char[] arr = s.toCharArray();
        for(int i=0;i<arr.length;i++){
            if('('==arr[i]){
                stack.push('(');
            }
            if('{'==arr[i]){
                stack.push('{');
            }
            if('['==arr[i]){
                stack.push('[');
            }
            if(stack.isEmpty()){
                return false;
            }
            if(')'==arr[i]&&stack.pop()!='('){
                return false;
            }
            if('}'==arr[i]&&stack.pop()!='{'){
                return false;
            }
            if(']'==arr[i]&&stack.pop()!='['){
                return false;
            }
        }
        return stack.isEmpty();
    }

这样我们就可以利用栈的先入后出特性快速解决括号合法性校验问题了。

0条评论
0 / 1000
陈****迪
5文章数
0粉丝数
陈****迪
5 文章 | 0 粉丝
原创

利用栈的数据结构解决实际问题

2023-10-16 11:09:37
6
0

栈(Stack)是一种常见的数据结构,它具有特定的数据访问方式和操作规则。栈通常采用后进先出(Last-In-First-Out,LIFO)的原则,这意味着最后进栈的元素将首先出栈。

栈通常支持两种基本操作:

  1. 入栈(Push):将数据元素放入栈的顶部。新元素成为栈的最顶部元素,覆盖先前在栈顶的元素。

  2. 出栈(Pop):从栈的顶部移除元素,并返回被移除的元素。这个操作会导致栈的大小减小。

此外,栈还支持以下操作:

  1. 查看栈顶元素(Top):查看栈顶的元素,但不将其移出栈。

  2. 判断栈是否为空:检查栈中是否还有元素。

栈作为一种数据结构,最让人熟知的是在java中函数调用和递归:栈通常用于管理函数调用的堆栈帧。每当一个函数被调用,一个新的堆栈帧被推入栈中,包含了函数的局部变量和返回地址。当函数执行完成时,堆栈帧被弹出。栈也用于递归算法,其中递归函数调用被压入栈中,以便在递归调用返回时能够恢复到之前的状态。

在我们的日常开发中,还可以用栈的结构特点巧妙解决哪些实际问题呢?

判断括号合法性问题

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

例如 "(1{2[3]4}5)"就是正确的,而"{2[3}4]"是错误的,因为在"["未与"]"闭合之前就遇到了"}"。

如果用一般的判断方式,可能需要初始化几个变量,来记录三种括号各自出现的次数,可能还需要其他变量来记录各个括号的闭合状态,不仅编程麻烦还不利于理解阅读。我们来看下如何借助栈的数据结果来解决以上问题。

遍历字符串s的每个字符,当遇到左括号时,将字符放入栈中。当遇到右括号时,弹出栈顶的字符,并判断是否和右括号是同种类型的左括号,最后判断栈是否为空。

    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        char[] arr = s.toCharArray();
        for(int i=0;i<arr.length;i++){
            if('('==arr[i]){
                stack.push('(');
            }
            if('{'==arr[i]){
                stack.push('{');
            }
            if('['==arr[i]){
                stack.push('[');
            }
            if(stack.isEmpty()){
                return false;
            }
            if(')'==arr[i]&&stack.pop()!='('){
                return false;
            }
            if('}'==arr[i]&&stack.pop()!='{'){
                return false;
            }
            if(']'==arr[i]&&stack.pop()!='['){
                return false;
            }
        }
        return stack.isEmpty();
    }

这样我们就可以利用栈的先入后出特性快速解决括号合法性校验问题了。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
1
0