什麼是單調棧?
顧名思義,單調棧就是一個棧,棧中的單調的,單調棧也分為單調遞增棧和單調遞減棧,實質上就是把一些備援的狀态去除了。
- 單調遞增棧:單調遞增棧就是從棧底到棧頂資料是從大到小
- 單調遞減棧:單調遞減棧就是從棧底到棧頂資料是從小到大
單調棧的使用場景
一般為找離某元素最近的最大(最小)的數
例題:
給定一個長度為N的整數數列,輸出每個數左邊第一個比它小的數,如果不存在則輸出-1。
input:
5
3 4 2 7 5
output:
-1 3 -1 2 2
示例代碼:
#include <iostream>
#include <stack>
using namespace std;
const int maxn = 1e5+10;
int main(){
int n, tmp, tt;
cin >> n;
stack<int> q;
for (int i = 0; i < n; i++){
cin >> tmp;
while(!q.empty() && q.top() >= tmp) q.pop();
if(q.empty()) printf("-1 ");
else printf("%d ",q.top());
q.push(tmp);
}
return 0;
}