C++STL之stack和queue容器适配器: 相关习题解析

embedded/2024/11/15 0:56:28/

1. 最小栈

. - 力扣(LeetCode)

思路:

一、整体架构

 
  1. 使用两个栈 stmin_st 分别实现不同的功能。
    • st 用于存放插入的数据,即主要的数据存储栈,模拟常规的数据存储结构。
    • min_st 用于存放最小的元素,通过特定的插入和弹出规则,始终保持栈顶为当前 st 中的最小元素。
 

二、插入操作(push)

 
  1. 对于 st
    • 正常插入新元素,无论该元素的大小如何,都直接将其压入 st。这保证了数据的完整存储,不进行任何筛选或特殊处理。
  2. 对于 min_st
    • min_st 第一次为空时,先插入一个元素。这是初始化操作,确保 min_st 有一个起始元素,以便后续进行比较和更新。
    • 如果插入的元素比 min_st 的栈顶元素小,就将该元素插入 min_st。这样做的目的是当有新的更小元素出现时,更新 min_st 的栈顶,使其始终保持当前 st 中的最小元素在栈顶。例如,如果当前 min_st 的栈顶是 5,新插入的元素是 4,那么将 4 压入 min_st,此时 min_st 的栈顶变为 4,代表当前最小元素为 4。
 

三、弹出操作(pop)

 
  1. 对于 st
    • 正常弹出栈顶元素。按照栈的先进后出原则,删除最后插入 st 的元素。
  2. 对于 min_st
    • 在弹出 st 的元素后,需要检查该元素是否与 min_st 的栈顶元素相等。如果相等,说明当前要弹出的元素是最小元素,那么也需要将 min_st 的栈顶元素弹出。这是为了保持两个栈的同步,确保 min_st 始终反映 st 中的最小元素。例如,如果 stmin_st 的栈顶都是 4,当从 st 中弹出 4 时,也需要从 min_st 中弹出 4,以保证 min_st 的栈顶仍然是 st 中剩余元素的最小元素。
class MinStack {
public:stack<int> st;stack<int> min_st;MinStack() { }void push(int val) {st.push(val);if(min_st.empty() || val <= min_st.top()) {min_st.push(val);}}void pop() {if(st.top() == min_st.top()) {min_st.pop();}st.pop();}int top() {return st.top();}int getMin() {return min_st.top();}
};

2. 栈的弹出压入序列

栈的压入、弹出序列__牛客网

思路:

       首先遍历压入顺序的序列。在遍历过程中,将压入顺序中的元素依次压入辅助栈,同时不断检查辅助栈的栈顶元素是否与弹出顺序的当前元素相等。如果相等,就将辅助栈的栈顶元素弹出,并移动弹出顺序的索引。继续这个过程,直到压入顺序的所有元素都被处理完。最终,如果辅助栈为空,说明给定的压入顺序和弹出顺序是合法的栈的操作顺序;如果辅助栈不为空,则说明不是合法的弹出顺序。

class Solution {
public:bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {int pushi = 0;int popi = 0;stack<int> st;while (pushi < pushV.size()) {st.push(pushV[pushi]);++pushi;  while (!st.empty() && st.top() == popV[popi]) {st.pop();++popi;}}return st.empty();}
};

3. 逆波兰表达式求值

. - 力扣(LeetCode)

4. 用栈实现队列

. - 力扣(LeetCode)

5. 用队列实现栈

. - 力扣(LeetCode)

6. 数组中第K个大的元素

. - 力扣(LeetCode)

方法一:优先级队列求解

     把数组的数据入队,然后pop前 k-1 个数据,栈顶就是第 K 大的数。

时间复杂度:堆排序的时间复杂度是 N*logN,取最坏,时间复杂度是 N*logN。

空间复杂:构建了堆,空间复杂度是O(N)。

class Solution {
public:int findKthLargest(vector<int>& nums, int k) {priority_queue<int>   pq;for(auto& e : nums) {pq.push(e);}while(--k) {pq.pop();} return pq.top();     }
};

方法二:排序

     排序的底层是快排,快排使用三数取中法,避免了最坏的情况。

时间复杂度是 O(N*logN)

空间复杂度是 O(1)

class Solution {
public:int findKthLargest(vector<int>& nums, int k) {sort(nums.begin(), nums.end());return nums[nums.size() - k];}
};

 

7. 有效的括号

. - 力扣(LeetCode)

8. 字符串解码

. - 力扣(LeetCode)

9. 每日温度

. - 力扣(LeetCode)

10. 柱状图中最大的矩形

. - 力扣(LeetCode)


http://www.ppmy.cn/embedded/114122.html

相关文章

力扣438 找到字符串中所有字母异位词 Java版本

文章目录 题目描述代码 题目描述 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示例 1: 输入: s …

【C#】vs2022 .net8

Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com) 更新就会出现

搜维尔科技:OptiTrack采集到的平衡数据,并对人形机器人进行编程,可以确保机器人的动作精度和准确性

OptiTrack具备高精度以及远追踪距离的双层特点&#xff0c;其捕捉范围最远可达91m&#xff0c;是大型场地&#xff08;如体育馆、足球场、虚拟拍摄制作棚等&#xff09;捕捉的最佳选择。 OptiTrack光学动作捕捉系统是目前全球市占率较高的全身动捕产品&#xff0c;可实现精度误…

Golang 中实现动态代理

在 Go 语言中&#xff0c;没有像 Java 中那样直接支持的动态代理机制&#xff0c;因为 Go 是静态类型的编程语言&#xff0c;不支持像 Java 反射那样基于接口的动态代理。但我们可以通过组合使用反射&#xff08;reflect 包&#xff09;和高阶函数的方式&#xff0c;实现类似于…

Prometheus+grafana+kafka_exporter监控kafka运行情况

使用Prometheus、Grafana和kafka_exporter来监控Kafka的运行情况是一种常见且有效的方案。以下是详细的步骤和说明&#xff1a; 1. 部署kafka_exporter 步骤&#xff1a; 从GitHub下载kafka_exporter的最新版本&#xff1a;kafka_exporter项目地址&#xff08;注意&#xff…

第1步win10宿主机与虚拟机通过NAT共享上网互通

VM的CentOS采用NAT共用宿主机网卡宿主机器无法连接到虚拟CentOS 要实现宿主机与虚拟机通信&#xff0c;原理就是给宿主机的网卡配置一个与虚拟机网关相同网段的IP地址&#xff0c;实现可以互通。 1、查看虚拟机的IP地址 2、编辑虚拟机的虚拟网络的NAT和DHCP的配置&#xff0c;…

【H2O2|全栈】关于CSS(6)CSS基础(五)

目录 CSS基础知识 前言 准备工作 网页项目规范 创建项目 布局 补充一部分属性 outline border-radius 预告和回顾 后话 CSS基础知识 前言 本系列博客将分享层叠样式表&#xff08;CSS&#xff09;有关的知识点。 本期博客主要分享的是网页项目规范&#xff0c;ou…

CSS clip-path 属性的使用

今天记录一个css属性clip-path&#xff0c;首先介绍下这个属性。 clip-path 是CSS中的一个神奇属性&#xff0c;它能够让你像魔术师一样&#xff0c;对网页元素施展“裁剪魔法”——只展示元素的一部分&#xff0c;隐藏其余部分。想象一下&#xff0c;不用依赖图片编辑软件&am…