#include<stack> --栈的头文件
栈的特点 : 先进后出 , 后进先出
相关函数:
top() 获取栈顶元素 ,返回栈顶元素的值
pop() 删除栈顶元素 ,没有返回值
push() 放入元素 ,没有返回值
empty() 为空返回 true 否则返回false
size() 元素的个数 ,返回值为 无符号整型
语法
stack<int> stk; //创建一个栈,里面的元素是int类型
739. 每日温度 https://leetcode.cn/problems/daily-temperatures/
https://leetcode.cn/problems/daily-temperatures/
提示
        给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
思路
单调栈,单调栈使用的场景:左边或者右边第一个比他大或者小的。
创建一个栈,遍历数组,将第一个元素放入栈,每个元素与栈顶比较,当栈不为空且找到后面比栈顶大的一个元素,将栈顶元素弹出,然后利用下标返回数组对应的元素
class Solution {
public:vector<int> dailyTemperatures(vector<int>& temp) {stack<int>stk;vector<int>res(temp.size(),0);    stk.push(0);    for(int i=1;i<temp.size();i++){while(!stk.empty()&&temp[i]>temp[stk.top()]){res[stk.top()]=i-stk.top();stk.pop();}stk.push(i);//不执行循环和循环结束都执行}return res;}
};496. 下一个更大元素 I https://leetcode.cn/problems/next-greater-element-i/
https://leetcode.cn/problems/next-greater-element-i/
nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。
给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。
对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。
返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。
思路:
这个解法通过栈和哈希表来寻找
nums1中每个元素在nums2中的下一个更大元素。首先,使用哈希表记录nums1中每个元素的位置。然后,遍历nums2,利用栈来寻找每个元素右侧的第一个更大元素。如果当前元素大于栈顶元素,则找到了栈顶元素的下一个更大元素,此时更新结果数组。通过这种方式,能够高效地为nums1中的每个元素找到其在nums2中的下一个更大元素,如果不存在则结果为-1。
class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {stack<int>stk;map<int,int>m;stk.push(0);for(int i=0;i<nums1.size();i++){m[nums1[i]]=i;}vector<int>res(nums1.size(),-1);for(int i=1;i<nums2.size();i++){//栈不为空 并且nums2[i]>nums2[stk[top]]//说明stk.pop()这个位置找到了下一个更大元素 while(!stk.empty()&&nums2[i]>nums2[stk.top()]){if(m.find(nums2[stk.top()])!=m.end()) {//m[nums2[stk.top()]]代表的是nums2[stk.top()]在nums1中的下标res[m[nums2[stk.top()]]]=nums2[i];}stk.pop();//不管这个元素是不是nums1中的都要弹出否则会卡在这}stk.push(i);}return res;}
};