模拟栈与队列

  int stk[N], tt;  //tt为栈顶
  
  stk[++ tt] = x;  //入栈
  
  tt --;  //弹出
  
  if(tt > 0)  not empty;
  else empty;
  
  
  //----------
  
  //队列
  //先入先出
  
  int q[N], tt, hh;  //队尾与队头
  
  //入队
  q[++ tt] = x;
  
  //出队
  hh ++;    //hh本为0,向tt靠近
  
  if(hh <= tt)  not empty;
  else empty;

单调

考虑暴力情况,再试着剪枝,删掉一些冗余的元素,看剩下的元素是否满足某些性质,如果单调,则可以用单调栈或单调队列做

单调栈

  • 使用时关键在于解决找到一个数的左边或右边,第一个与它满足某种条件的数(如小于或大于)
  • 将该数在给定数组位置之前的所有数入栈(暴力来看其实就是对一个数,在其前面(或后面)的所有数里找到第一个满足条件的数,这样就相当于维护了一个栈,将所有的数入栈)入栈前明确条件,若要找到小于的,就应当把之前数组中大于后者的去掉,因为后者更优,离得更近且更小,能用后者肯定不会用到前者(找到特性简化栈), 再入栈找到满足条件的第一个数。
 

单调队列

  • 同理于单调栈
  • 用于处理如一给定数组中滑动窗口,满足在队尾进队,队头出队的形式,求某一要求值
  • 去除队伍中不会再用到的值简化队列,如要求最小值,但入队有小值时,队头的值不止寿命短而且大则可以去掉,此时队列变成单调,头小尾大