C++ 高级数据结构————[ 单调栈 ]

这篇具有很好参考价值的文章主要介绍了C++ 高级数据结构————[ 单调栈 ]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

每周一篇的算法文章来了

今天讲解的是高级数据结构中的——单调栈

单调栈,顾名思义,就是升级版的栈()

先回顾一下栈把

,是一种线性表,它的特点是只能从一边进出,并且先进后出,后进先出。就想枪的弹夹一样。

而单调栈,跟他有一点不同

单调栈,每时每刻都要保持栈中呈现单调递增或单调递减 

但是,有一个问题:

还是举个栗子

如果把6,7,12,3,1,8依次入栈,那么就会呈现这种样子

C++ 高级数据结构————[ 单调栈 ] 

 怎么看,他都不是单调递增或递减

那我们就要引入单调栈的方法了

一.单调递增栈

单调递增栈中的单调递增,指的是依次出栈的数据呈单调递增

就比如C++ 高级数据结构————[ 单调栈 ]

 文章来源地址https://www.toymoban.com/news/detail-419180.html

在出栈时,顺序为1,2,3,4,5,6

回到刚才的栗子

C++ 高级数据结构————[ 单调栈 ]

如果要达到单调递增栈

顺序就是这样的:

首先,6入栈

C++ 高级数据结构————[ 单调栈 ]

 接着,7如果入栈,就不满足单调递增,所以要把6踢了,让7入栈

C++ 高级数据结构————[ 单调栈 ]

 然后12要入栈,把7踢了,保证单调性

C++ 高级数据结构————[ 单调栈 ]

 接着,3正常入栈,能够保持单调递增

C++ 高级数据结构————[ 单调栈 ]

 1也正常入栈

C++ 高级数据结构————[ 单调栈 ]

因为8要入栈,所以为了保持单调性,必须把1和3踢了

C++ 高级数据结构————[ 单调栈 ] 

 最后的单调递增栈的样子

代码:

单调递增栈:找到右起第一个比当前数字大的元素

for (int i=T.size()-1;i>=0;i--){
    while(!st.empty()&&T[st.top()]<=T[i]){
        st.pop();
    }
    st.push(i);
}

二.单调递减栈

与单调递增栈相反,单调递减栈是按照出栈顺序来说从大到小

还是模拟一遍栗子:

首先6照常进栈

C++ 高级数据结构————[ 单调栈 ]

 7也是照常进栈,并且能保持单调递减性

C++ 高级数据结构————[ 单调栈 ]

 12也照常进栈

C++ 高级数据结构————[ 单调栈 ]

这时,3要进栈,为了保持单调性,必须把比他大的都踢出去,也就是所有

C++ 高级数据结构————[ 单调栈 ] 

 因为1要进栈,并且保持单调性,所以踢了3

C++ 高级数据结构————[ 单调栈 ]

最后8照常进栈

C++ 高级数据结构————[ 单调栈 ] 

 

整个的单调递减栈就是这样的

代码:

找出左起第一个小于等于当前数字的元素

for (int i=0;i<T.size();i++){
    while(!st.empty()&&T[st.top]>T[i]){
        st.pop();
    }
    st.push(i);
}

作用:

单调栈可以以O(n)的时间复杂度求出某个数的左边第一个比他小于的或右边第一个比他大于的

例题:

题目描述

给出项数为n的整数数列a1…n。定义函数 f(i) 代表数列中第 i个元素之后第一个大于 ai 的元素的下标,即 f(i)=mini<j<=n, aj>ai{j}。若不存在,则f(i)=0,试求出 f(1…n) 

输入

第一行一个正整数n,第二行n个正整数 a1…n。

输出

一行n个整数f(1…n)的值。

 

样例输入1
5
1 4 2 3 5
样例输出1
2 5 4 5 0

单调递增栈的模板题

# include <iostream>
# include <cstdio>
# include <algorithm>
# include <stack>
using namespace std;
# define int long long
int n,a[3000005],f[3000005];
stack <int> s;
signed main(){
	scanf("%lld",&n);
	for (int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	for (int i=n;i>=1;i--){
		while(!s.empty()&&a[s.top()]<=a[i]){
			s.pop();
		}
		f[i]=s.empty()?0:s.top();
		s.push(i);
	}
	for (int i=1;i<=n;i++){
		printf("%lld ",f[i]);
	}
	return 0;
}

---------------------------------------------------------------------------------------------------------------------------------

今天对单调栈的讲解就到这里

有什么问题大家可以随时评论区讨论

C++ 高级数据结构————[ 单调栈 ]

 

到了这里,关于C++ 高级数据结构————[ 单调栈 ]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 数据结构高级算法

    数据结构高级算法

      目录 最小生成树 Kruskal(克鲁斯卡尔)(以边为核心) 9) 不相交集合(并查集合) 基础 Union By Size 图-相关题目 4.2 Greedy Algorithm 1) 贪心例子 Dijkstra Prim Kruskal 最优解(零钱兑换)- 穷举法 Leetcode 322 最优解(零钱兑换)- 贪心法 Leetcode 322 3) Huffman 编码问题 问题引入 Huffman 树 Huffm

    2024年02月21日
    浏览(17)
  • 【算法 & 高级数据结构】树状数组:一种高效的数据结构(二)

    【算法 & 高级数据结构】树状数组:一种高效的数据结构(二)

    🚀 个人主页 :为梦而生~ 关注我一起学习吧! 💡 专栏 :算法题、 基础算法、数据结构~赶紧来学算法吧 💡 往期推荐 : 【算法基础 数学】快速幂求逆元(逆元、扩展欧几里得定理、小费马定理) 【算法基础】深搜 数据结构各内部排序算法总结对比及动图演示(插入排序

    2024年03月26日
    浏览(12)
  • 【算法 & 高级数据结构】树状数组:一种高效的数据结构(一)

    【算法 & 高级数据结构】树状数组:一种高效的数据结构(一)

    🚀 个人主页 :为梦而生~ 关注我一起学习吧! 💡 专栏 :算法题、 基础算法~赶紧来学算法吧 💡 往期推荐 : 【算法基础 数学】快速幂求逆元(逆元、扩展欧几里得定理、小费马定理) 【算法基础】深搜 树状数组 (Binary Indexed Tree,BIT)是一种数据结构,用于高效地处理

    2024年03月11日
    浏览(19)
  • 数据结构的魔法:高级算法优化实战

    数据结构的魔法:高级算法优化实战

    🎉欢迎来到数据结构学习专栏~数据结构的魔法:高级算法优化实战 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:数据结构学习 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水平有

    2024年02月06日
    浏览(10)
  • 学习高级数据结构:探索平衡树与图的高级算法

    学习高级数据结构:探索平衡树与图的高级算法

    🎉欢迎来到数据结构学习专栏~学习高级数据结构:探索平衡树与图的高级算法 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:数据结构学习 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技

    2024年02月09日
    浏览(11)
  • 深入学习与探索:高级数据结构与复杂算法

    深入学习与探索:高级数据结构与复杂算法

    🎉欢迎来到数据结构学习专栏~深入学习与探索:高级数据结构与复杂算法 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:数据结构学习 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和

    2024年02月09日
    浏览(13)
  • [数据结构]---单调栈

    [数据结构]---单调栈

    单调栈分为 单调递增栈 和 单调递减栈 。 单调递增栈:从 栈顶 到 栈底 数据是 从小到大 ( 栈顶元素最小 ) 单调递减栈:从 栈顶 到 栈底 数据是 从大到小 ( 栈顶元素最大 ) 有一组数8,3,6,12。从左到右依次入栈,如果 栈为空 或 入栈元素小于栈顶元素 ,入栈。 (1)

    2024年02月07日
    浏览(9)
  • 数据结构——单调栈

    数据结构——单调栈

            队列,栈,前面的链接是对普通的栈,和普通的队列的一个讲解,如果没有对普通的栈和队列不了解的小伙伴可以先看看前面链接中的讲解;         什么是单调,一个序列呈递增或者递减,并且没有一个位置违反了这个递增递减的性质,那么这个序列就算单调

    2024年02月09日
    浏览(9)
  • 【Java数据结构与算法】Day2-高级排序(希尔、归并、快速、计数)

    【Java数据结构与算法】Day2-高级排序(希尔、归并、快速、计数)

    ✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。 🍎个人主页:Hhzzy99 🍊个人信条:坚持就是胜利! 💞当前专栏:【Java数据结构与算法】 🥭本文内容:Java数据结构与算法中的比较高级的排序,希尔排序、归并排序、快速排序、计数排序

    2024年02月02日
    浏览(22)
  • 【C++】数据结构与算法:常用排序算法

    【C++】数据结构与算法:常用排序算法

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍常用排序算法。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 排序算法是计算机科学中常见的一类算法,用于将一组数据按照特定的顺序进行排

    2024年02月14日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包