特殊數(shù)據(jù)結(jié)構(gòu)之使用Java實(shí)現(xiàn)單調(diào)棧示例
單調(diào)棧
單調(diào)棧是一種特殊的數(shù)據(jù)結(jié)構(gòu),它由棧內(nèi)元素構(gòu)成單調(diào)遞增或單調(diào)遞減的特性。具體來(lái)說(shuō),對(duì)于單調(diào)遞增棧,棧內(nèi)元素從棧底到棧頂單調(diào)遞增;對(duì)于單調(diào)遞減棧,棧內(nèi)元素從棧底到棧頂單調(diào)遞減。
單調(diào)棧的應(yīng)用非常廣泛,包括字符串匹配、路徑尋找、序列比對(duì)等場(chǎng)景。
例如,在字符串匹配中,我們可以使用單調(diào)棧來(lái)優(yōu)化暴力匹配算法。具體來(lái)說(shuō),我們使用單調(diào)遞減棧存儲(chǔ)文本串中尚未匹配的字符,保證棧底是文本串中最早出現(xiàn)的尚未匹配的字符。然后,對(duì)于模式串中的每個(gè)字符,我們依次與棧頂元素進(jìn)行匹配。如果匹配成功,則將該字符壓入棧中;如果匹配失敗,則將棧頂元素彈出,相當(dāng)于將該字符“忽略”。通過(guò)這種方式,我們可以快速找到模式串在文本串中的所有出現(xiàn)位置。
除了字符串匹配,單調(diào)棧還可以應(yīng)用于其他場(chǎng)景。例如,在路徑尋找問(wèn)題中,我們可以使用單調(diào)遞增棧來(lái)存儲(chǔ)每個(gè)節(jié)點(diǎn)的后繼節(jié)點(diǎn)。具體來(lái)說(shuō),我們將當(dāng)前節(jié)點(diǎn)的后繼節(jié)點(diǎn)依次壓入棧中,并保證棧內(nèi)元素按照到達(dá)當(dāng)前節(jié)點(diǎn)的距離進(jìn)行排序。然后,對(duì)于每個(gè)新到達(dá)的節(jié)點(diǎn),我們可以從棧頂找到距離該節(jié)點(diǎn)最近的祖先節(jié)點(diǎn),并以此為起點(diǎn)繼續(xù)搜索。通過(guò)這種方式,我們可以快速找到從起點(diǎn)到終點(diǎn)的最短路徑。
總之,單調(diào)棧是一種非常實(shí)用的數(shù)據(jù)結(jié)構(gòu),它可以廣泛應(yīng)用于各種場(chǎng)景。
使用Java實(shí)現(xiàn)單調(diào)棧
單調(diào)棧是一種特殊的數(shù)據(jù)結(jié)構(gòu),用于解決一些特定的問(wèn)題。以下是使用Java實(shí)現(xiàn)單調(diào)棧的示例代碼:
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();
}
}方法解析
在上面的代碼中,我們使用了兩個(gè)棧,stack 用于存儲(chǔ)普通元素,maxStack 用于存儲(chǔ)最大元素。
在 push() 方法中,我們首先判斷要插入的元素是否大于等于棧頂元素,如果是,則直接將其壓入 stack 中;否則,我們將從 maxStack 中彈出比當(dāng)前元素小的元素,直到找到一個(gè)比當(dāng)前元素大的元素或 maxStack 為空。然后將當(dāng)前元素壓入 stack 中,并壓入 maxStack 中。
在 pop() 和 top() 方法中,我們直接從 stack 中彈出或返回棧頂元素。
在 isEmpty() 方法中,我們判斷 stack 是否為空。
以上就是java中特殊數(shù)據(jù)結(jié)構(gòu)單調(diào)棧使用場(chǎng)景示例詳解的詳細(xì)內(nèi)容,更多關(guān)于java單調(diào)棧數(shù)據(jù)結(jié)構(gòu)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Java?C++?算法題解leetcode145商品折扣后最終價(jià)格單調(diào)棧
- Java算法真題詳解運(yùn)用單調(diào)棧
- Java 數(shù)據(jù)結(jié)構(gòu)算法Collection接口迭代器示例詳解
- java數(shù)據(jù)結(jié)構(gòu)循環(huán)隊(duì)列的空滿判斷及長(zhǎng)度計(jì)算
- java數(shù)據(jù)結(jié)構(gòu)與算法數(shù)組模擬隊(duì)列示例詳解
- java數(shù)據(jù)結(jié)構(gòu)算法稀疏數(shù)組示例詳解
- java數(shù)據(jù)結(jié)構(gòu)圖論霍夫曼樹(shù)及其編碼示例詳解
相關(guān)文章
SpringBoot統(tǒng)一功能處理實(shí)現(xiàn)的全過(guò)程
最近在做項(xiàng)目時(shí)需要對(duì)異常進(jìn)行全局統(tǒng)一處理,主要是一些分類入庫(kù)以及記錄日志等,下面這篇文章主要給大家介紹了關(guān)于SpringBoot統(tǒng)一功能處理實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
springboot引用kettle實(shí)現(xiàn)對(duì)接oracle數(shù)據(jù)的示例代碼
這篇文章主要介紹了springboot引用kettle實(shí)現(xiàn)對(duì)接oracle數(shù)據(jù),其實(shí)kettle集成到springboot里面沒(méi)有多少代碼,這個(gè)功能最主要的還是ktr文件的編寫(xiě),只要ktr編寫(xiě)好了,放到指定文件夾下,寫(xiě)個(gè)定時(shí)任務(wù)就完事了,需要的朋友可以參考下2022-12-12
淺談@Aspect@Order各個(gè)通知的執(zhí)行順序
這篇文章主要介紹了@Aspect@Order各個(gè)通知的執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
springboot解決前后端分離時(shí)的跨域問(wèn)題
這篇文章主要介紹了springboot如何解決前后端分離時(shí)的跨域問(wèn)題,幫助大家更好的理解和學(xué)習(xí)使用springboot,感興趣的朋友可以了解下2021-04-04
4個(gè)Java8中你需要知道的函數(shù)式接口分享
Java?8?中提供了許多函數(shù)式接口,包括Function、Consumer、Supplier、Predicate?等等。本文主要來(lái)和大家介紹一下它們的具體使用,需要的可以參考一下2023-04-04
springboot與vue實(shí)現(xiàn)簡(jiǎn)單的CURD過(guò)程詳析
這篇文章主要介紹了springboot與vue實(shí)現(xiàn)簡(jiǎn)單的CURD過(guò)程詳析,圍繞springboot與vue的相關(guān)資料展開(kāi)實(shí)現(xiàn)CURD過(guò)程的過(guò)程介紹,需要的小伙伴可以參考一下2022-01-01

