特殊数据结构之使用Java实现单调栈示例

 更新时间:2023年09月04日 09:49:47   作者:阿芯爱编程  
这篇文章主要为大家介绍了特殊数据结构之使用Java实现单调栈示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

单调栈

单调栈是一种特殊的数据结构,它由栈内元素构成单调递增或单调递减的特性。具体来说,对于单调递增栈,栈内元素从栈底到栈顶单调递增;对于单调递减栈,栈内元素从栈底到栈顶单调递减。

单调栈的应用非常广泛,包括字符串匹配、路径寻找、序列比对等场景。

例如,在字符串匹配中,我们可以使用单调栈来优化暴力匹配算法。具体来说,我们使用单调递减栈存储文本串中尚未匹配的字符,保证栈底是文本串中最早出现的尚未匹配的字符。然后,对于模式串中的每个字符,我们依次与栈顶元素进行匹配。如果匹配成功,则将该字符压入栈中;如果匹配失败,则将栈顶元素弹出,相当于将该字符“忽略”。通过这种方式,我们可以快速找到模式串在文本串中的所有出现位置。

除了字符串匹配,单调栈还可以应用于其他场景。例如,在路径寻找问题中,我们可以使用单调递增栈来存储每个节点的后继节点。具体来说,我们将当前节点的后继节点依次压入栈中,并保证栈内元素按照到达当前节点的距离进行排序。然后,对于每个新到达的节点,我们可以从栈顶找到距离该节点最近的祖先节点,并以此为起点继续搜索。通过这种方式,我们可以快速找到从起点到终点的最短路径。

总之,单调栈是一种非常实用的数据结构,它可以广泛应用于各种场景。

使用Java实现单调栈

单调栈是一种特殊的数据结构,用于解决一些特定的问题。以下是使用Java实现单调栈的示例代码:

    import java.util.ArrayList;  
    import java.util.Stack;  
    public class MonotonicStack {  
        private Stack<Integer> stack;  
        private Stack<Integer> maxStack;  
        public MonotonicStack() {  
            stack = new Stack<>();  
            maxStack = new Stack<>();  
        }  
        public void push(int val) {  
            if (val >= stack.peek()) {  
                stack.push(val);  
            } else {  
                while (!maxStack.isEmpty() && val > maxStack.peek()) {  
                    maxStack.pop();  
                }  
                stack.push(val);  
                maxStack.push(val);  
            }  
        }  
        public int pop() {  
            if (!stack.isEmpty()) {  
                return stack.pop();  
            } else {  
                return -1;  
            }  
        }  
        public int top() {  
            if (!stack.isEmpty()) {  
                return stack.peek();  
            } else {  
                return -1;  
            }  
        }  
        public boolean isEmpty() {  
            return stack.isEmpty();  
        }  
    }

方法解析

在上面的代码中,我们使用了两个栈,stack 用于存储普通元素,maxStack 用于存储最大元素。

在 push() 方法中,我们首先判断要插入的元素是否大于等于栈顶元素,如果是,则直接将其压入 stack 中;否则,我们将从 maxStack 中弹出比当前元素小的元素,直到找到一个比当前元素大的元素或 maxStack 为空。然后将当前元素压入 stack 中,并压入 maxStack 中。

在 pop() 和 top() 方法中,我们直接从 stack 中弹出或返回栈顶元素。

在 isEmpty() 方法中,我们判断 stack 是否为空。

以上就是java中特殊数据结构单调栈使用场景示例详解的详细内容,更多关于java单调栈数据结构的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot统一功能处理实现的全过程

    SpringBoot统一功能处理实现的全过程

    最近在做项目时需要对异常进行全局统一处理,主要是一些分类入库以及记录日志等,下面这篇文章主要给大家介绍了关于SpringBoot统一功能处理实现的相关资料,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • springboot引用kettle实现对接oracle数据的示例代码

    springboot引用kettle实现对接oracle数据的示例代码

    这篇文章主要介绍了springboot引用kettle实现对接oracle数据,其实kettle集成到springboot里面没有多少代码,这个功能最主要的还是ktr文件的编写,只要ktr编写好了,放到指定文件夹下,写个定时任务就完事了,需要的朋友可以参考下
    2022-12-12
  • 浅谈@Aspect@Order各个通知的执行顺序

    浅谈@Aspect@Order各个通知的执行顺序

    这篇文章主要介绍了@Aspect@Order各个通知的执行顺序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • springboot解决前后端分离时的跨域问题

    springboot解决前后端分离时的跨域问题

    这篇文章主要介绍了springboot如何解决前后端分离时的跨域问题,帮助大家更好的理解和学习使用springboot,感兴趣的朋友可以了解下
    2021-04-04
  • Spring5新功能日志框架Log4j2整合示例

    Spring5新功能日志框架Log4j2整合示例

    这篇文章主要为大家介绍了Spring5新功能之日志框架Log4j2的整合示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Spring中的三级缓存使用及说明

    Spring中的三级缓存使用及说明

    文章介绍了Spring框架中循环依赖的问题,包括循环依赖的定义、常见场景和解决方法,构造器注入的循环依赖无法解决,而field属性注入(setter方法注入)循环依赖可以解决,Spring通过“三级缓存”机制来解决循环依赖问题,其中singletonFactories是关键
    2025-11-11
  • 4个Java8中你需要知道的函数式接口分享

    4个Java8中你需要知道的函数式接口分享

    Java 8 中提供了许多函数式接口,包括Function、Consumer、Supplier、Predicate 等等。本文主要来和大家介绍一下它们的具体使用,需要的可以参考一下
    2023-04-04
  • java中流的使用

    java中流的使用

    本文主要介绍了java中流的使用以及分类。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • 一文详解Java线程安全的集合有哪些

    一文详解Java线程安全的集合有哪些

    在Java中线程安全的集合类对于多线程编程至关重要,它们能够确保在多个线程同时访问集合时数据的一致性和完整性,下面这篇文章主要介绍了Java线程安全集合有哪些的相关资料,需要的朋友可以参考下
    2025-06-06
  • springboot与vue实现简单的CURD过程详析

    springboot与vue实现简单的CURD过程详析

    这篇文章主要介绍了springboot与vue实现简单的CURD过程详析,围绕springboot与vue的相关资料展开实现CURD过程的过程介绍,需要的小伙伴可以参考一下
    2022-01-01

最新评论