從棧底元素到棧頂元素呈單調遞增或單調遞減,棧內序列滿足單調性的棧;
(1)當新元素在單調性上優於棧頂時(單增棧新元素比棧頂大(公升序)單減棧新元素比棧頂小 (降序) ),壓棧,棧深+1;
(2)當新元素在單調性與棧頂相同(新元素於棧頂相同)或劣於棧頂時(單增棧新元素比棧頂小,單減棧新元素比棧頂大),彈棧,棧深-1;
模擬實現乙個在原輸入資料的順序基礎上遞減的單調棧:現在有一組數10,3,7,4,12。從左到右依次入棧,則如果棧為空或入棧元素值小於棧頂元素值,則入棧;否則,如果入棧則會破壞棧的單調性,則需要把比入棧元素小的元素全部出棧。單調遞減的棧反之。
輸入
510 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。從左到右依次入棧,則如果棧為空或入棧元素值小於棧頂元素值,則入棧 否則,如果入棧則會破壞棧的單調性,則需要把比入棧元素小的元素全部出棧。單調遞減...