关于后端:单调栈

39次阅读

共计 1395 个字符,预计需要花费 4 分钟才能阅读完成。

枯燥栈是一种非凡的数据结构,它由栈内元素形成枯燥递增或枯燥递加的个性。具体来说,对于枯燥递增栈,栈内元素从栈底到栈顶枯燥递增;对于枯燥递加栈,栈内元素从栈底到栈顶枯燥递加。

枯燥栈的利用十分宽泛,包含字符串匹配、门路寻找、序列比对等场景。

例如,在字符串匹配中,咱们能够应用枯燥栈来优化暴力匹配算法。具体来说,咱们应用枯燥递加栈存储文本串中尚未匹配的字符,保障栈底是文本串中最早呈现的尚未匹配的字符。而后,对于模式串中的每个字符,咱们顺次与栈顶元素进行匹配。如果匹配胜利,则将该字符压入栈中;如果匹配失败,则将栈顶元素弹出,相当于将该字符“疏忽”。通过这种形式,咱们能够疾速找到模式串在文本串中的所有呈现地位。

除了字符串匹配,枯燥栈还能够利用于其余场景。例如,在门路寻找问题中,咱们能够应用枯燥递增栈来存储每个节点的后继节点。具体来说,咱们将以后节点的后继节点顺次压入栈中,并保障栈内元素依照达到以后节点的间隔进行排序。而后,对于每个新达到的节点,咱们能够从栈顶找到间隔该节点最近的先人节点,并以此为终点持续搜寻。通过这种形式,咱们能够疾速找到从终点到起点的最短门路。

总之,枯燥栈是一种十分实用的数据结构,它能够广泛应用于各种场景。
枯燥栈是一种非凡的数据结构,用于解决一些特定的问题。以下是应用 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 是否为空。

正文完
 0