数据结构(栈)

栈遵循先进后出原则,是一种常用数据结构,基本用法如下:

#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早日遇见爱情(鲜花)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值