队列即是一个特殊的数组,这个数组最前面的元素称为 队头 尾部元素称为 队尾
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include <iostream> using namespace std; const int N = 100010; int q[N];
int hh = 0; int tt = -1;
int m;
string s;
void push(int x){ q[++tt] = x; }
void pop(){ hh++; }
void empty(){ if(tt >= hh) cout << "NO" << endl; else cout << "YES" << endl; }
void query (){ cout << q[hh] << endl; }
|
以及一道和单调栈类似的模板题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #include <iostream> using namespace std;
const int N = 1e6+10;
int p[N],q[N],n,k,hh,tt=-1;
int main(){ scanf("%d%d",&n,&k); for(int i=0;i<n;i++) scanf("%d",&p[i]); for(int i=0;i<n;i++){ if(hh<=tt&&q[hh]<i-k+1) hh++; while(hh<=tt&&p[q[tt]]>=p[i]) tt--; q[++tt] = i; if(i>=k-1) cout << p[q[hh]] << " "; } cout << endl; hh=0,tt=-1; for(int i=0;i<n;i++){ if(hh<=tt&&q[hh]<i-k+1) hh++; while(hh<=tt&&p[q[tt]]<=p[i]) tt--; q[++tt] = i; if(i>=k-1) cout << p[q[hh]] << " "; } return 0; }
|
最近工作有点忙,有时间再来补充详细吧hh