队列:后进先出
普通队列
初始化:hh = 0, tt = -1;
// hh 表示队头,tt表示队尾
// 预定义tt时,注意队列是否有初始化第一个值
// 若循环while(hh <= tt ) 开始时队列为空,则让tt=-1,否则tt=0
int q[N], hh = 0, tt = -1;
// 队尾插入,队头弹出
// 向队尾插入一个数
q[ ++ tt] = x;
// 从队头弹出一个数
hh ++ ;
// 取出队头元素
q[hh];
// 取出队尾元素
q[tt];
// 判断队列是否为空
if (hh <= tt)
{
}
循环队列
// 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)
{
}
单调队列
// 常见模型:找出滑动窗口中的最大值/最小值
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;
}