棧 —— 模板題 AcWing 828. 模擬棧
// tt表示棧頂
int stk[N], tt = 0;
// 向棧頂插入一個數
stk[ ++ tt] = x;
// 從棧頂彈出一個數
tt -- ;
// 棧頂的值
stk[tt];
// 判斷棧是否爲空
if (tt > 0)
{
}
隊列 —— 模板題 AcWing 829. 模擬隊列
1. 普通隊列:
// hh 表示隊頭,tt表示隊尾
int q[N], hh = 0, tt = -1;
// 向隊尾插入一個數
q[ ++ tt] = x;
// 從隊頭彈出一個數
hh ++ ;
// 隊頭的值
q[hh];
// 判斷隊列是否爲空
if (hh <= tt)
{
}
2. 循環隊列
// hh 表示隊頭,tt表示隊尾的後一個位置
int q[N], hh = 0, tt = 0;
// 向隊尾插入一個數
q[tt ++ ] = x;
if (tt == N) tt = 0;
// 從隊頭彈出一個數
hh ++ ;
if (hh == N) hh = 0;
// 隊頭的值
q[hh];
// 判斷隊列是否爲空
if (hh != tt)
{
}
單調棧 —— 模板題 AcWing 830. 單調棧
常見模型:找出每個數左邊離它最近的比它大/小的數
int tt = 0;
for (int i = 1; i <= n; i ++ )
{
while (tt && check(stk[tt], i)) tt -- ;
stk[ ++ tt] = i;
}
單調隊列 —— 模板題 AcWing 154. 滑動窗口
常見模型:找出滑動窗口中的最大值/最小值
int hh = 0, tt = -1;
for (int i = 0; i < n; i ++ )
{
while (hh <= tt && check_out(q[hh])) hh ++ ; // 判斷隊頭是否滑出窗口
while (hh <= tt && check(q[tt], i)) tt -- ;
q[ ++ tt] = i;
}