Leecode---栈---每日温度 / 最小栈及栈和队列的相互实现

:先入后出;队列:先入先出

一、每日温度
Leecode—739题目
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
在这里插入图片描述
单调栈思路
1、新建一个存储数组下标的栈,将数组元素的下标依次入栈;
2、入栈的过程中,要保证栈是单调的;如果此时数组元素大于栈顶下标对应的数组元素,弹出栈顶,再将此时的下标i入栈;
3、在这个过程中,下标i挤掉栈顶下标的时候,i-stack.top(),这个值就是我们要的“下一天”;没有出现“挤掉”情况的下标,也就是最后栈中仍剩余的下标,就是未来没有更高的温度,在answer数组中对应下标为初始的0即可。

class Solution
{
public:vector<int> dailyTemperatures(vector<int>& temperatures){int n = temperatures.size();vector<int> answer(n);// 存储下标的单调栈stack<int> tmp;for(int i=0; i<n; i++){// 若栈不为空,且t[i]>栈顶while(!tmp.empty() && temperatures[i] > temperatures[tmp.top()]){// 记录栈顶的下标int top_Index = tmp.top();// 当前栈顶对应的下标,它的‘下一天’就是 i-tmp.top()answer[top_Index] = i - top_Index;tmp.pop();}// 单调栈,将小于栈底的下标入栈tmp.push(i);}return answer;}
};

二、最小栈
Leecode–155:
题目
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。

class MinStack
{
public:// 定义两个栈容器stack<int> st;stack<int> minStack;// 构造函数清空栈容器MinStack(){while(!st.empty()){st.pop();}while(!minStack.empty()){minStack.pop();}// 初始化最小栈的栈顶元素为最大值,为了防止top访问空指针报错minStack.push(INT_MAX);}void push(int x){st.push(x);// 比较最小栈栈顶值和当前值x的大小,将最小值压入最小栈// 记录当前st栈的最小值为栈顶元素int minval = std::min(minStack.top(),x);minStack.push(minval);	// 最小值压入最小栈}void pop(){st.pop();minStack.pop();}int top(){return st.top();}int getMin(){// 取最小栈的栈顶元素,就是此时st栈的最小值return minStack.top();}
};

三、用队列实现栈
问题描述
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶(入栈)。
int pop() 移除并返回栈顶元素(出栈)。
int top() 返回栈顶元素(取栈顶)。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

#include<iostream>
#include<stack>
#include<queue>
using namespace std;class MyStack
{queue<int> q;	// 定义一个队列
public:MyStack(){}void push(int x)	// 入栈{int n = q.size();q.push(x);for(int i=0; i<n; i++){q.push(q.front());	// 将队头放入队尾q.pop();			// 移除队头}}int pop()	// 出栈==出队,有返回值,记录队头->移除队头->返回所记录的队头{int t = q.front();q.pop();return t;}int top()		// 取栈顶==取队头{int t = q.front();return t;}bool empty()	// 判断栈空==判断队空{return q.empty();}
};

四、用栈实现队列
top()是取栈顶元素,不会删除里面的元素,返回栈顶的引用;
pop()是删除栈顶元素,返回void。
int peek() :返回队列开头的元素
void push(int x): 将元素x放到队列的末尾
int pop() : 从队列开头移除并返回元素
boolean empty() : 若队列为空,返回true,否则返回false

算法实现
用两个栈模拟一个队列,s1为输入栈,s2为输出栈;
1、push(x):将x放入s1;
2、pop():若s2为空,则将s1中所有的元素放入s2,s2的栈顶出栈,并返回栈顶元素;
3、peek():若s2为空,将s1中所有的元素放入s2,并返回栈顶元素;
4、empty():若s1 / s2都为空,返回true,否则返回false。

class MyQueue
{
private:stack<int> s1, s2;		// s1为输入栈,s2为输出栈void int_2_out(){// 如果输出栈为空,则将输入栈所有元素放入输出栈if (s2.empty()){while(!s1.empty()){//s1先把栈顶元素取出来放入s2,然后再pop删除,s1为空则停止s2.push(s1.top());s1.pop();}}}
public:MyQueue(){}void push(int x)	// 入队{s1.push(x);	}int pop()			// 模拟出队{// pop是从输出栈出栈int_2_out();	// 判断输出栈是否为空,若为空,将输入栈放入输出栈int x = s2.top();s2.pop();return x;		// 返回栈顶}int peek()			// 取队头操作{in_2_out();return s2.top();}bool empty()		// 栈 s1/s2 都为空,队列才为空{return s1.empty() && s2.empty();}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/846468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【安卓跨进程通信IPC】-- Binder

目录 BinderBinder是什么&#xff1f;进程空间分配进程隔离Binder跨进程通信机制模型优点AIDL常见面试题 Binder 夯实基础之超详解Android Binder的工作方式与原理以及aidl示例代码 比较详细的介绍&#xff1a;Android跨进程通信&#xff1a;图文详解 Binder机制 原理 操作系统…

可变引用useRef()保存可变数据

场景&#xff1a;useState的状态值一旦通过状态更新函数改变了&#xff0c;React 就会重新渲染组件。 方法&#xff1a;可变引用useRef()保存可变数据&#xff0c;这些数据在更改时不会触发重新渲染 每次渲染组件时&#xff0c;countRenderRef可变引用的值都会使countRenderRef…

Cargo字节镜像源

在 Windows 系统默认为&#xff1a;%USERPROFILE%.cargo&#xff0c;在类 Unix 系统默认为&#xff1a;$HOME/.cargo&#xff0c;在此目录下新建config文件&#xff0c;填写内容如下&#xff1a; [source.crates-io] replace-with rsproxy[source.rsproxy] registry "ht…

GPT-4o横空出世

GPT-4o的技术革新和优化显著&#xff0c;尤其是其多模态处理、速度与性能优化、以及情感理解与表达能力方面。而个人整体感受则普遍正面积极。 GPT-4o的版本对比&#xff1a; 技术进化&#xff1a;从GPT-3到GPT-4再到GPT-4o&#xff0c;OpenAI的模型在参数数量、训练方法、以及…

day20

第一题 23. 合并 K 个升序链表 本题是已经知道有多个链表&#xff0c;需要我们将这些链表按照升序排列的规则组合到一起&#xff0c;同时这些链表都是升序排列的&#xff1b; 解法一&#xff1a; 利用优先级队列 步骤一&#xff1a;利用优先级队列床架一个小根堆&#xff1b; …

【OpenHarmony】TypeScript 语法 ④ ( 函数 | TypeScript 具名函数和匿名函数 | 可选参数 | 剩余参数 | 箭头参数 )

文章目录 一、TypeScript 函数1、TypeScript 具名函数和匿名函数2、TypeScript 函数 与 JavaScript 函数对比3、TypeScript 函数 可选参数4、TypeScript 函数 剩余参数5、TypeScript 箭头函数 参考文档 : <HarmonyOS第一课>ArkTS开发语言介绍 一、TypeScript 函数 1、Typ…

Llama(二):Open WebUI作为前端界面,使用本机的llama3

目录 背景 Open WebUI是什么 工程能力特性 产品功能特性 用户体验特性 Open WebUI安装并使用 背景 Mac M1芯片&#xff0c;16G 内存 llama3 8B的部署参考Llama&#xff08;一&#xff09;&#xff1a;Mac M1芯片运行Llama3-CSDN博客在Mac M1 16G内存环境中&#xff0c;…

牛客热题:缺失的第一个正整数

牛客热题&#xff1a;数组中出现一次的两个数字> &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 …

6月2号总结

刷题记录Codeforces Round 925 &#xff08;A,B,C&#xff09; 1.A. Recovering a Small String 问题 - A - Codeforces 输入&#xff1a; 5 24 70 3 55 48 输出&#xff1a; aav rzz aaa czz auz 给定一个3~78的整数&#xff0c;将这个整数分成a,b,c&#xff0c;其中1表示…

数据结构之二叉搜索树(TreeSetTreeMap)

目录 一.搜索树 1.1概念 1.2适用场景 2.二叉搜索树的基本操作 2.1二叉搜索树的定义 2.2查找 2.1.1基本思路 2.3插入 2.3.1基本思路 2.4删除 2.4.1基本思路 2.5遍历 2.6性能分析 二.TreeSet Map和Set 1.概念 2.模型 1.定义 2.基本操作 三.TreeMap 1.定义 2.基…

LLM大语言模型学习资料网站(git、gitee、等)

先上几个关于大模型方面比较好的开源地址吧&#xff1a; 1.清华智普ChatGLM&#xff1a; GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型 ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型&#xff0c;详细…

【计算机毕设】基于SpringBoot的医院管理系统设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 本项目旨在设计并实现一个基于SpringBoot的医院管理系统&#xff0c;以提高医院管理效率&#xff0c;优化医疗服务流程&#xff0c;提升患者就诊体验…

Codeforces Round 949 (Div. 2)(A,B题解)

这场真是给我打的汗流浃背了&#xff0c;这场真的巨难&#xff08;可能是因为我二进制根本就没学好的原因吧&#xff09; 反正总共就搞了两道题&#xff0c;第一道题注重于思维&#xff0c;第二道题纯二进制&#xff0c;第三道题看着也是二进制&#xff08;最后时间不够了&…

力扣 142题 环形链表Ⅱ 记录

题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内…

代码随想录算法训练营第57天|● 739. 每日温度 ● 496.下一个更大元素 I

单调栈&#xff1a;维持一个单调的栈&#xff0c;用于解决离最近的比自己大or小的元素的距离 739. 每日温度 和之前那个top k 最小堆感觉思路是一样的 class Solution:def dailyTemperatures(self, temperatures: List[int]) -> List[int]:ans[0]*len(temperatures)stack…

Python知识点18---进程和线程

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 首先我要给大家说一下进程和线程有什么区别&#xff0c;进程包含着线…

详解 Spark SQL 核心编程知识

一、SparkSQL 概述 1. 概念 Spark SQL 是 Spark 用于结构化数据 (structured data) 处理的 Spark 模块&#xff0c;使用 SQL 的方式简化 RDD 的开发 2. Hive VS SparkSQL Hive 是早期唯一运行在 Hadoop 上的 SQL-on-Hadoop 工具&#xff0c;但是 MapReduce 计算过程中大量的中…

URL路由基础

本书1-7章样章及配套资源下载链接: https://pan.baidu.com/s/1OGmhHxEMf2ZdozkUnDkAkA?pwdnanc 源码、PPT课件、教学视频等&#xff0c;可以从前言给出的下载信息下载&#xff0c;大家可以评估一下。 对于高质量的Web应用来讲&#xff0c;使用简洁、优雅的URL设计模式非常…

时间序列的谱分解

refer&#xff1a;15.pdf (berkeley.edu) Stat 153 Fall 2010 (berkeley.edu)

linux mtd分区应用操作sample之某分区擦除

什么是擦除? 把flash相关的区域数据bit置为1的过程 #include <mtd/mtd-user.h> #include <mtd/mtd-abi.h> struct erase_info_user {__u32 start; // 起点 __u32 length; //长度 块大小对齐 不然报参数失败 };struct erase_info_user64 {__u64 sta…