C++之单调栈

单调栈的性质

单调栈是一种特殊的栈,特殊之处在于栈内的元素都保持一个单调性。
假设下图是一个栈内元素的排列情况(单调递增的栈):
引用
此时插入情况有两种:
(1)插入元素大于栈顶元素:
因为7 > 6,满足栈内元素单调递增的性质,所以可以直接插入7到栈顶
引用
(2)当插入元素小于栈顶元素的时候,当插入3的时候,需要将栈顶的6,4弹出,在插入,例如:
引用

功能

利用单调栈可以找出从左/右遍历第一个比它小/大的元素的位置
例如说:
现在有一个数组a[4] = {5,7,3,4},要你找出每一个元素左边最靠近它的最小元素的位置(下标+1),如果没有元素比它小,则输出0
此时我们会想到,从每一个数字开始想左边遍历,这是一个朴素的算法,我们就不再多说了。
我们要说的是怎么样利用单调栈来解决该问题
1.设计一个数组res[4],来保存结果
2.开一个栈,这个栈的性质是,当栈为空的时候,将对应的res[i] = 0;当栈顶元素是从左开始,输入的数中最小的那个的下标,如果进栈的元素小于或者等于a[栈顶元素],则输出0;如果大于,则输出栈顶元素+1。

下面上代码:

#include<iostream>
#include<stack>
using namespace std;

int main() {
   
	//n表示要找的总数
	int n; cin >> n;
	//a用来保存输入的数据
	int* a = new int[n];
	//res_left用来保存对应的结果
	int* res_left = new int[n];
	stack<int>s;
	for (int i = 0; i < n; i++)cin >> a[i];
	//找出a[i]左边和右边最近的一个比他小的值的下标
	for (int i = 0; i < n; i++) {
   
		while (!s.empty() && a[i] <=
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值