特殊數(shù)據(jù)結構之使用Java實現(xiàn)單調棧示例
單調棧
單調棧是一種特殊的數(shù)據(jù)結構,它由棧內元素構成單調遞增或單調遞減的特性。具體來說,對于單調遞增棧,棧內元素從棧底到棧頂單調遞增;對于單調遞減棧,棧內元素從棧底到棧頂單調遞減。
單調棧的應用非常廣泛,包括字符串匹配、路徑尋找、序列比對等場景。
例如,在字符串匹配中,我們可以使用單調棧來優(yōu)化暴力匹配算法。具體來說,我們使用單調遞減棧存儲文本串中尚未匹配的字符,保證棧底是文本串中最早出現(xiàn)的尚未匹配的字符。然后,對于模式串中的每個字符,我們依次與棧頂元素進行匹配。如果匹配成功,則將該字符壓入棧中;如果匹配失敗,則將棧頂元素彈出,相當于將該字符“忽略”。通過這種方式,我們可以快速找到模式串在文本串中的所有出現(xiàn)位置。
除了字符串匹配,單調棧還可以應用于其他場景。例如,在路徑尋找問題中,我們可以使用單調遞增棧來存儲每個節(jié)點的后繼節(jié)點。具體來說,我們將當前節(jié)點的后繼節(jié)點依次壓入棧中,并保證棧內元素按照到達當前節(jié)點的距離進行排序。然后,對于每個新到達的節(jié)點,我們可以從棧頂找到距離該節(jié)點最近的祖先節(jié)點,并以此為起點繼續(xù)搜索。通過這種方式,我們可以快速找到從起點到終點的最短路徑。
總之,單調棧是一種非常實用的數(shù)據(jù)結構,它可以廣泛應用于各種場景。
使用Java實現(xiàn)單調棧
單調棧是一種特殊的數(shù)據(jù)結構,用于解決一些特定的問題。以下是使用Java實現(xiàn)單調棧的示例代碼:
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中特殊數(shù)據(jù)結構單調棧使用場景示例詳解的詳細內容,更多關于java單調棧數(shù)據(jù)結構的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot統(tǒng)一功能處理實現(xiàn)的全過程
最近在做項目時需要對異常進行全局統(tǒng)一處理,主要是一些分類入庫以及記錄日志等,下面這篇文章主要給大家介紹了關于SpringBoot統(tǒng)一功能處理實現(xiàn)的相關資料,文中通過圖文以及實例代碼介紹的非常詳細,需要的朋友可以參考下2023-01-01
springboot引用kettle實現(xiàn)對接oracle數(shù)據(jù)的示例代碼
這篇文章主要介紹了springboot引用kettle實現(xiàn)對接oracle數(shù)據(jù),其實kettle集成到springboot里面沒有多少代碼,這個功能最主要的還是ktr文件的編寫,只要ktr編寫好了,放到指定文件夾下,寫個定時任務就完事了,需要的朋友可以參考下2022-12-12
springboot與vue實現(xiàn)簡單的CURD過程詳析
這篇文章主要介紹了springboot與vue實現(xiàn)簡單的CURD過程詳析,圍繞springboot與vue的相關資料展開實現(xiàn)CURD過程的過程介紹,需要的小伙伴可以參考一下2022-01-01

