枯燥栈是一种非凡的数据结构,它由栈内元素形成枯燥递增或枯燥递加的个性。具体来说,对于枯燥递增栈,栈内元素从栈底到栈顶枯燥递增;对于枯燥递加栈,栈内元素从栈底到栈顶枯燥递加。
枯燥栈的利用十分宽泛,包含字符串匹配、门路寻找、序列比对等场景。
例如,在字符串匹配中,咱们能够应用枯燥栈来优化暴力匹配算法。具体来说,咱们应用枯燥递加栈存储文本串中尚未匹配的字符,保障栈底是文本串中最早呈现的尚未匹配的字符。而后,对于模式串中的每个字符,咱们顺次与栈顶元素进行匹配。如果匹配胜利,则将该字符压入栈中;如果匹配失败,则将栈顶元素弹出,相当于将该字符“疏忽”。通过这种形式,咱们能够疾速找到模式串在文本串中的所有呈现地位。
除了字符串匹配,枯燥栈还能够利用于其余场景。例如,在门路寻找问题中,咱们能够应用枯燥递增栈来存储每个节点的后继节点。具体来说,咱们将以后节点的后继节点顺次压入栈中,并保障栈内元素依照达到以后节点的间隔进行排序。而后,对于每个新达到的节点,咱们能够从栈顶找到间隔该节点最近的先人节点,并以此为终点持续搜寻。通过这种形式,咱们能够疾速找到从终点到起点的最短门路。
总之,枯燥栈是一种十分实用的数据结构,它能够广泛应用于各种场景。
枯燥栈是一种非凡的数据结构,用于解决一些特定的问题。以下是应用 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
是否为空。