栈遵循先进后出原则,是一种常用数据结构,基本用法如下:
#include<iostream>
#include<stack>
using namespace std;
int main()
{
stack<int> stk;
//定义一个整数栈
stk.push(1);
//向栈中放入数据1
cout << stk.top() << endl; //输出顶部元素
stk.push(2);
//放入2
cout << stk.top() << endl;
stk.push(3);
cout << stk.top() << endl;
stk.pop(); //第一次删除顶部元素
cout << stk.top() << endl;
if (stk.empty()) cout << "Yes" << endl; //判断栈是否为空
else cout << "No" << endl;
stk.pop(); //第二次删除
cout << stk.top() << endl;
if (stk.empty()) cout << "Yes" << endl;
else cout << "No" << endl;
stk.pop();
if (stk.empty()) cout << "Yes" << endl;
else cout << "No" << endl;
return 0;
}
输出
For the algorithm(单调栈):
单调栈可分为单调递增栈和单调递减栈,单调递增栈(不单调递减)具体实现的伪代码如下:
stack<int> stk;
//定义一个整数栈
for (遍历数组)
{
if (栈空 || 栈顶元素大于等于当前比较元素) 入栈;
else {
while (栈不为空 && 栈顶元素小于当前元素)
{
栈顶元素出栈;
更新;
}
当前元素入栈;
}
}
例题1
给定一个长度为N的整数数列,输出每一个数左边第一个比它小的数,如果不存在则输出-1。
输入格式
第一行包含正整数N,表示数列长度。
第二行N个整数,表示整数数列。
输出格式
共一行,包含N个整数,其中第i个数表示第i个数左边第一个比它小的数,如果不存在则输出-1.
数据范围
1<=N<=1e5
1<=数列元素<=1e9
输入样例
5
3 4 2 7 5
输出样例
-1 3 -1 2 2
对这题发现暴力可以容易做出,但是时间复杂度过大,容易超时,因此可以考虑构造一个单调栈,先判断是否栈空,若是则输出-1,并将第一个元素存入栈中,如样例将3首先存入栈,然后读取4时判断是否大于等于3,若是则输出栈顶元素3,并将4存入栈,再输入2时判断2是小于3,则删除栈顶元素4,再判断是小于4,则删除此时的栈顶元素4,此时变成空栈,证明前面没有元素比2小,输出-1,并将2存入栈,再输入7,发现7>2,则输出栈顶元素2,并将7存入栈中,最后输入5,发现5小于7,于是删除栈顶元素7,此时栈顶元素变为2,继续判断5和栈顶元素的关系,发现2<5,则·输出栈顶元素2。代码实现如下:
#include<iostream>
#include<stack>
#include<cstdio>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
stack<int> stk;
int n = 0;
cin >> n;
while (n--)
{
int t = 0;
cin >> t;
while (stk.size() && stk.top() >= t) stk.pop();
if (stk.size()) cout << stk.top() << " ";
else cout << "-1" << " ";
stk.push(t);
}
return 0;
}
运行结果如下
例题2
来源:牛客网
好串
牛牛喜欢跟字符串玩耍,他刚刚学会了一个新操作,将一个字符串x插入另一个字符串y中(包括放在开头和结尾)
牛牛认为如果一个串是好的当这个串能按照如下方法被构造出来:
一开始,有一个空串,然后执行0次或者若干次操作,每次操作将ab插入当前的字符串
根据上面的定义,ab, aabb, aababb都是好串,aab,ba,abbb并不是好串
现在给你一个字符串s,判断s是否是好串
输入描述
输入一行包含一个字符串,长度不超过50
输出描述
输出"Good" 或者 "Bad"
示例1
输入:
ab
输出:
Good
示例2
输入:
aab
输出:
Bad
示例3
输入:
abaababababbaabbaaaabaababaabbabaaabbbbbbbb
输出:
Bad
代码实现如下
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
#define per(i,m,n) for(int i=m;i<=n;i++)
using namespace std;
int cnt1 = 0, cnt2 = 0;
int main()
{
ios::sync_with_stdio(false);
string s;
cin >> s;
stack<char>j;
j.push(s[0]);
per(i,1,s.length()-1){
if(s[i]=='b'&&!j.empty()){
if(j.top()=='a') j.pop();
}
else j.push(s[i]);
}
if(j.empty()) cout<<"Good"<<endl;
else if(!j.empty()) cout<<"Bad"<<endl;
return 0;
}
最后笔者写点题外话,所有博客皆是作学习过程中的笔记,若有侵权,请联系删,拜谢。
同时今天是2022年1月29号,马上就是新年,提前祝各位新年快乐。此外明天也是笔者与npy楠子的一周年纪念日,祝好。也祝各位coder早日遇见爱情(鲜花)