單調棧初步學習

2021-10-17 19:07:39 字數 2726 閱讀 5596

從棧底元素到棧頂元素呈單調遞增或單調遞減,棧內序列滿足單調性的棧;

(1)當新元素在單調性上優於棧頂時(單增棧新元素比棧頂大(公升序)單減棧新元素比棧頂小 (降序) ),壓棧,棧深+1;

(2)當新元素在單調性與棧頂相同(新元素於棧頂相同)或劣於棧頂時(單增棧新元素比棧頂小,單減棧新元素比棧頂大),彈棧,棧深-1;

模擬實現乙個在原輸入資料的順序基礎上遞減的單調棧:

現在有一組數10,3,7,4,12。從左到右依次入棧,則如果棧為空入棧元素值小於棧頂元素值,則入棧;否則,如果入棧則會破壞棧的單調性,則需要把比入棧元素小的元素全部出棧。單調遞減的棧反之。

輸入

5

10 3 7 4 12

#include

using

namespace std;

const

int n=

1e6;

int stk[n]

,tt=0;

intmain()

//輸出模擬棧中的元素

for(

int i =

1; i <= tt;

++i) cout<<<

" ";

return0;

}

輸出:

3 4 12

僅第14行的符號變了。

#include

using

namespace std;

const

int n=

1e6;

int stk[n]

,tt=0;

intmain()

//輸出模擬棧中的元素

for(

int i =

1; i <= tt;

++i) cout<<<

" ";

return0;

}

輸出:

給定乙個長度為n的整數數列,輸出每個數左邊第乙個比它小的數,如果不存在則輸出-1。

輸入格式

第一行包含整數n,表示數列長度。

第二行包含n個整數,表示整數數列。

輸出格式

共一行,包含n個整數,其中第 i 個數表示第 i 個數的左邊第乙個比它小的數,如果不存在則輸出-1。

資料範圍

1≤n≤105

1≤數列中元素≤109

輸入樣例:

5

3 4 2 7 5

輸出樣例:

-1 3 -1 2 2

暴力,二重迴圈:

#include

using

namespace std;

const

int n=

1e5+10;

int a[n]

;int

main()

}if(j==-1

) cout<<

"-1 ";}

return0;

}

我們根據這個過程,觀察到一些性質,一些數可能再也不會被用到

在查詢過程中,我們是從第1個數a[0]開始查詢的,

第1個數左邊肯定不存在數,輸出-1,並把a[0]入棧;

第2個數a[1]時,現在開始判斷a[1]和a[0]的關係,分兩種情況:

a[1]>a[0] ,此時a[0]符合題目要求:是a[1]左邊的第乙個比它小的數,可以輸出,並把a[1]入棧。

a[1]<=a[0],此時a[1]左邊不滿足符合要求的數,那麼輸出-1,同時由於a[1]<=a[0],所以a[0]就是那個再也不會被用到的數,因為一旦a[0]是符合小於a[i](i>=2),那麼a[1]必然符合,且比a[0]靠近a[i],所以不僅要輸出-1,還要把a[0]彈出(因為用不到了),再把a[1]入棧。

第3個數a[2],有了第二步的判斷,現在只用判斷a[2]和a[1]的關係即可:(a[1]一定是左邊裡面最大的),然後具體的操作情況都和第2步一樣。

越往後,棧裡面的元素可能有多個,如果a[i]<=a[i-1],a[i-1]被彈出後,不能停止,還要繼續判斷a[i]與a[i-2]的關係,直到找到滿足要求的數或者棧為空為止。即如果棧不為空並且a[i]<=a[i-k],就一直出棧,更適合while語句。

最終,我們得到的是乙個在原輸入資料的順序基礎上,得到的乙個公升序的儲存資料的棧。

#include

using

namespace std;

const

int n=

1e5+10;

int a[n]

,tt;

//這裡採用陣列模擬棧來操作,從下標1開始儲存

intmain()

return0;

}

單調佇列與單調棧 初步

單調佇列與單調棧 初步 雖然是個不算複雜的資料結構,但是總感覺自己好像不太會,所以做一些題目以期能更好地掌握該知識點。p5788 模板 單調棧 對於每個元素而言,要找在其之後第乙個大於它的元素,所以我們可以維護乙個單調減棧 當新進入的元素進入後將之前某些小的元素擠出棧後,由於單調棧的性質可知這個元素...

單調棧學習筆記

定義 單調棧就是棧內元素遞增或者單調遞減的棧,並且只能在棧頂操作。單調棧的維護是o n 的時間複雜度,所有元素只會進進棧一次 性質 單調棧裡面的元素具有單調性 元素加入棧前會把棧頂破壞單調性的元素刪除 使用單調棧可以找到元素向左遍歷的第乙個比他小的元素 單增棧 也可以找到元素向左遍歷第乙個比他大的元...

單調棧 佇列學習

推薦部落格 單調棧 佇列只需滿足兩個條件即可,序列是單調的,並且符合棧和佇列的特性。實現 例如實現乙個單調遞增的棧,比如現在有一組數10,3,7,4,12。從左到右依次入棧,則如果棧為空或入棧元素值小於棧頂元素值,則入棧 否則,如果入棧則會破壞棧的單調性,則需要把比入棧元素小的元素全部出棧。單調遞減...