資料結構之單調棧

2022-07-09 06:27:21 字數 2362 閱讀 9659

dev.c++資料結構之單調棧:從數學上來講,函式的單調性也可以叫做函式的增減性。當函式f(x) 的自變數在其定義區間內增大(或減小)時,函式值f(x)也隨著增大(或減小),則稱該函式為在該區間上具有單調性。換句話來說,函式的單調性就是在區間內的自變數只增或只減。

我們說,數學中函式在一段區間內自變數只增或只減,那麼這個函式在這個區間內具有單調性。

那麼,這和單調棧有什麼關係呢?單調棧,你可以理解為乙個公升序或降序的棧。這裡給出一道例題。

洛谷單調棧模板

這道題就可以利用單調棧求解。我這裡給出三個手寫單調棧**,其中有兩個陣列模擬單調棧,都差不多。

#include#define maxn (int)(3e6+3e3)

using namespace std;

int n,a[maxn],s1[maxn],s2[maxn],ans[maxn],cnt=0;

int main()

for(int i=n;i>=1;i++)

for(int i=1;i<=n;i++)

}

差別在於棧的數量(第二段做了空間優化),仔細看。

#include#define maxn (int)(3e6+3e3)

using namespace std;

int n,a[maxn],s[maxn],ans[maxn],cnt=0;

int main()

for(int i=1;i<=n;i++)

}

那第二段**來講吧。日常解釋變數:

首先,為什麼是n->1呢?給乙個血的教訓

它輸出的答案與正解不搭邊。

你想想:它首先有乙個

if(cnt==0)ans[i]=0;else ans[i]=s[cnt];
那麼輸出的第乙個就一定是0

你看看樣例

讓我們來分析一波~~

陣列的最後一項後面是不是一定都是0?而資料範圍是不是1n,就只能是n->1了。能懂吧?不懂也沒關係。

它不是有

if(cnt==0)ans[i]=0;else ans[i]=s[cnt];
嗎?如果從後往前掃,則棧內的一定是從後往前的。而我的ans裡裝的是目前狀態下是s,題目給的是

如果從前往後掃,新元素還沒入棧,棧內的一定是這個元素以前的元素,所以只能從後往前掃,才符合這個**。

if(cnt==0)ans[i]=0;else ans[i]=s[cnt];
可以說迴圈內的**都是為了n->1而設計的。現在總懂了吧?有腦子的都能聽懂。

接下來有個小坑大家得注意一下。

我就在這裡在了幾個跟頭,注意while要加『=』,不要像我打個『>』或『

還有注意空棧要立馬跳出不要猶豫,否則就死迴圈了。因為空棧意味著棧內元素都為0,而資料範圍我不說了,所以要有乙個特判。

沒有比當前元素大的給0不過多解釋,然後把當前元素壓入棧內,這就是完整的**了。

最後給一下用stl的stack打的**(抄別人的**不是乙個好習慣)我不會告訴你這是60分**

#include#define maxn (int)(3e6+3e3)

using namespace std;

int n,a[maxn];

stacks;

int ans[maxn];

int main()

for(int i=1;i<=n;i++)

if(cnt==0)ans[i]=0;

else ans[i]=s.top();

s.push(i);

} for(int i=1;i<=n;i++)

}

建議大家少用stl,多用陣列,鍛鍊鍛鍊**能力,

最後想說:單調棧不能算是乙個資料結構,本質上是一種演算法,。要多理解哦!在附帶**乙個簡單易懂的洛谷紅名dalaomine_king的題解

基礎資料結構之單調棧

題目描述 給定乙個長度為n的整數數列,輸出每個數左邊第乙個比它小的數,如果不存在則輸出 1。輸入格式 第一行包含整數n,表示數列長度。第二行包含n個整數,表示整數數列。輸出格式 共一行,包含n個整數,其中第i個數表示第i個數的左邊第乙個比它小的數,如果不存在則輸出 1。資料範圍 1 n 105 1 ...

資料結構 單調棧

上班無事,刷力扣發現了個新名詞 單調棧 題目 496.下乙個更大元素 i 名字上就聽的出來,單調棧中存放的資料應該是有序的,所以單調棧也分為單調遞增棧和單調遞減棧 單調遞增棧 棧中資料出棧的序列為單調遞增序列 單調遞減棧 棧中資料出棧的序列為單調遞減序列 ps 這裡一定要注意所說的遞增遞減指的是出棧...

資料結構 單調棧

這是筆者的第一篇部落格,由於筆者自身水平的限制。用詞可能不夠準確,句子不太通順,水平可能也不太行,敬請指出,感激不盡!我們都知道棧 stack 是一種先入後出的資料結構,而單調棧建立在棧的基礎上,它區別於普通的棧的特殊之處在於 棧中的元素一直保持著單調遞增 單調遞減的關係 比如單調遞增棧中的元素自棧...