目录
小知识点
stack<int> a
是C++中一个简单的声明,表示创建一个名为 a
的栈(stack)对象,该栈用于存储整数(int)类型的数据。
在这里:
stack
是C++标准模板库(STL)中的一个容器类,用于表示后进先出(LIFO)的数据结构。<int>
表示该栈用于存储整数。a
是这个栈对象的名称。
你可以使用 push()
方法向栈中添加元素,使用 pop()
方法从栈中移除元素,使用 top()
方法查看栈顶元素,等等。例如:
#include <stack>
#include <iostream>
int main() {
stack<int> a; // 创建一个空的整数栈
a.push(10); // 向栈中添加一个元素
a.push(20); // 向栈中添加另一个元素
int top_element = a.top(); // 查看栈顶元素,应该是20
a.pop(); // 移除栈顶元素
top_element = a.top(); // 查看新的栈顶元素,应该是10
return 0;
}
验证栈序列
将元素一个个入栈,当栈顶元素等于出栈元素(跟第一个比较)时,则将栈顶元素弹出,然后再继续入栈,将栈顶元素与后面一个出栈元素(第二个)进行比较,以此类推
#include<stdio.h>
include<stack>
using namespace std;
stack<int>am;
int main()
{
int q;int n;
scanf("%d",&q);
while(q--){
int i;int a[100005]={0};
int b[100005]={0};
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
for(i=1;i<=n;i++)scanf("%d",&b[i]);//输入
int pos=1;//指针 首先指向第一个出栈元素;
for(i=1;i<=n;i++){
am.push(a[i]);//将元素入栈,先入第一个
while(!am.empty()&&am.top()==b[pos])//如果栈不为空并且出栈元素等于栈顶元素
{
am.pop();//移去栈顶元素
pos++;//指针往后走,指向下一个出栈元素
}
}
if(am.empty())//如果栈空,则代表出栈顺序可以实现
{
printf("Yes\n");
}
else{
printf("No\n");
}
while(!am.empty())am.pop();//清空栈
}
return 0;
}
单调栈
就是一个栈,不过栈内元素保证单调性。即,栈内元素要么从小到大,要么从大到小。
而单调栈维护的就是一个数前/后第一个大于/小于他的数。
从后往前依次入栈,每次放进去的数都跟栈顶元素比较,如果栈顶元素小于要放进去的这个数,那么就将栈顶元素弹出,循环这个过程,直至栈顶元素大于要放进去的数,则这个栈顶元素就是要放进去这个数后第一个比它大的数
#include<stdio.h>
#include<stack>
int a[4000005], b[4000005];
using namespace std;
int main()
{
stack<int>g;
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
for (int i = n; i >= 1; i--)
{
while (!g.empty() && a[g.top()] <= a[i])
{
g.pop();
}
if (g.empty())
{
b[i] = 0;
}
else {
b[i] = g.top();
}
g.push(i);
}
for (int i = 1; i <= n; i++)
{
printf("%d ", b[i]);
}
return 0;
}