特殊數(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)文章
java數(shù)據(jù)結(jié)構(gòu)算法稀疏數(shù)組示例詳解
這篇文章主要為大家介紹了java數(shù)據(jù)結(jié)構(gòu)算法稀疏數(shù)組示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06如何根據(jù)帶賬號(hào)密碼的WSDL地址生成JAVA代碼
這篇文章主要介紹了如何根據(jù)帶賬號(hào)密碼的WSDL地址生成JAVA代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Java后端學(xué)習(xí)精華之TCP通信傳輸協(xié)議詳解
TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會(huì)保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission Control Protocol,它是位于網(wǎng)絡(luò)OSI模型中的第四層2021-09-09Java?中的?clone(?)?和?new哪個(gè)效率更高
很多朋友不太清楚clone()和new那個(gè)更快?針對(duì)這個(gè)問(wèn)題我百度了好多資料,最終小編總結(jié)下關(guān)于Java?中的?clone(?)?和?new哪個(gè)效率更高的問(wèn)題,感興趣的朋友跟隨小編一起看看吧2021-12-12MyBatis?handleResultSet結(jié)果集解析過(guò)程示例
這篇文章主要為大家介紹了MyBatis?handleResultSet結(jié)果集解析過(guò)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02解決找不到符號(hào) 符號(hào):變量 log問(wèn)題
這篇文章主要介紹了解決找不到符號(hào) 符號(hào): 變量 log問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08