栈
特点:仅能从一端插入和取出元素(后进先出),先插入的元素在最前段,后插入的元素在最后端
- 添加元素只能从栈顶添加
- 取出元素只能从栈顶取出
(类似于水杯,先倒进去的部分最后喝到,后进去的部分最先喝到)
单调栈的伪代码
stack<int> st;
//此处一般需要给数组最后添加结束标志符,具体下面例题会有详细讲解
for (遍历这个数组)
{
if (栈空 || 栈顶元素大于等于当前比较元素)
{
入栈;
}
else
{
while (栈不为空 && 栈顶元素小于当前元素)
{
栈顶元素出栈;
更新结果;
}
当前数据入栈;
}
}
例题
给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。
#include<iostream>
using namespace std;
int f[100001], n;
int arr[1000001];
int main()
{
int r;
cin >> n;
for (int i = 1; i <= n; i++)
{
r = i-1;
cin >> arr[i];
//视左部分为栈,当栈尾不满足条件时则r--出栈,直到找到为止;
while (arr[r] >= arr[i] && r >0)r--;
if (r >0)f[i] = arr[r];
else f[i] = -1;
}
for (int i = 1; i <= n; i++)
cout << f[i] << " ";
}
队列
例题
#include<iostream>
using namespace std;
int queue[100000];
int main()
{
int n, a, i = 1,j=1;//i队首,j队尾
cin >> n;
while (n--)
{
string arr;
getchar();
cin >> arr;
if (arr == "push") {//队尾入列
cin >> a;
queue[j++] = a;
}
else if (arr == "pop") {//队首出列
i++;
}
else if (arr == "empty") {
if (i == j)cout << "YES" << endl;
else cout << "NO" << endl;
}
else if (arr == "query") {
cout << queue[i] << endl;
}
}
return 0;
}