棧和隊列的模擬模板

棧 —— 模板題 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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章