栈
栈的特点
先进后出,和一个半封闭容器类似,放了一堆肉饼,先放的肉饼后倒出来
stk[n]数组代表栈,tt代表栈点
关于栈的插入
void add(int x) { stk[++t] = x; }
|
关于栈的删除
关于判断栈是否为空
bool stkempty() { if (tt > 0) return false; else return true; }
|
总实现代码
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream>
using namespace std;
const int N = 10010;
int stk[N], tt;
void add(int x) { stk[++t] = x; }
void del( ) { tt--; }
bool stkempty() { if (tt > 0) return false; else return true; }
int main() { return 0; }
|
例题
问题描述
有一序列,输出每个数左边第一个比他小的数,没有则输出-1
|
诀窍:在while循环判断条件时,只要想该数不符合条件则跳过即可
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <cstdio> using namespace std;
const int N = 10010;
int stk[N], tt;
int main() { int n; scanf("%d ", &n);
for (int i = 0;i < n;++i) { int x; scanf("%d ", &x); while (tt && stk[tt] >= x) tt--; if (tt) printf("%d\n", stk[tt]); else printf("-1\n");
stk[++tt] = x; }
}
|
队列
队列的特点
先进先出,和枪上膛相似,先插进去的子弹先打出来
q[N]表示队列,hh表示对头,tt表示队尾
关于队列的插入
void add(int x) { q[++tt] = x; }
|
关于队列的删除(弹出)
关于队列的判断是否为空
bool qempty() { if (hh <= tt) return false; else return true; }
|
总实现代码
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream>
using namespace std;
const int N = 10010;
int q[N], hh, tt = -1;
void add(int x) { q[++tt] = x; } void del( ) { hh++; }
bool qempty() { if (hh <= tt) return false; else return true; }
int main() { return 0; }
|
例题
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream>
using namespace std;
const int N = 1000010;
int a[N],q[N],hh,tt;
int main() { int n,k; scanf("%d %d", &n,&k);
hh = 0, tt = -1; for (int i = 0;i < n;++i) scanf("%d", &a[i]);
for (int i = 0;i < n;++i) { if (hh <= tt && i - k + 1 > q[hh]) hh++; while (hh <= tt && a[q[tt]] >= a[i]) tt--; q[++tt] = i; if (i >= k - 1) printf("%d ", a[q[hh]]); } cout << endl; hh = 0, tt = -1; for (int i = 0;i < n;++i) { if (hh <= tt && i - k + 1 > q[hh]) hh++; while (hh <= tt && a[q[tt]] <= a[i]) tt--; q[++tt] = i; if (i >= k - 1) printf("%d ", a[q[hh]]); }
cout << endl;
return 0; }
|