9.21算法(栈)

news2025/1/11 1:14:39

用两个栈实现队列

栈:只允许在一头进行入队和出队,先进后出

队列:只允许一头入队,另一头出队,先进先出

如果先都放入一个栈中,就是倒序的,然后再把第一个栈中的元素依次移动到另一个栈中,又倒了一次序,就是正序了,即先进先出

class Solution
{
public:
    void push(int node) {
        stack1.push(node);
    }//先都放入一个栈中

    int pop() {
        int res;
        while(!stack1.empty()){
            stack2.push(stack1.top());//把第一个栈中的元素倒到第二个栈中
            stack1.pop();
        }
        res=stack2.top();//此时第二个栈的第一个元素就是最先入队的元素
        stack2.pop();
        while(!stack2.empty()){
            stack1.push(stack2.top());//再把第二个栈的元素都倒到第一个中,目的是为了下一步的入队,即从尾部放入元素
            stack2.pop();
        }
        return res;
    }

private:
    stack<int> stack1;
    stack<int> stack2;
};

包含min函数的栈

有一个误区是,只用一个值存储当前栈的最小值,但如果这个最小值出栈后,就没了

所以函数就是要,根据栈的状态,时刻更新最小值

那就是说当前栈有几个元素,就应该用几个元素保存最小值,表示分别在栈有几个元素时所存储的最小值

所以用两个栈,一个栈就是存值的,另一个就是当前栈的最小值,那么操作就是每入栈一个元素,就和上个Min栈中的栈顶元素(表示前面所有元素的Min)比较,如果比它小,就让当前的栈的min为这个新入的元素,如果不是,那就依旧保留之前的min,直到遇到一个比它小的才更新。

stack<int>common;
stack<int>minnum;
void push(int val) {
	common.push(val);
	if (minnum.empty() || minnum.top() > val) {
		minnum.push(val);
	}
	else {
		minnum.push(minnum.top());
	}
}
void pop() {
	common.pop();
	minnum.pop();
}
int top() {
	return common.top();
}
int min() {
	return minnum.top();
}

有效括号序列 

遇到左括号序列就入栈,遇到右括号序列就出栈

最后如果栈有余或者遇到右括号但是栈为空,就是false

怎么保证遇到的右括号是和当前左括号栈的栈顶元素匹配?

不应该让左括号系列入栈,而是应该让接下来期望遇到的元素入栈,如果还是左括号序列,就接着入栈期望元素,如果遇到了不是左括号序列的元素,那么正确的必须是栈顶元素的期望的元素,不然就是错误的。

stack<int>s1;
for (int i = 0; i < s.length(); i++) {
	if (s[i] == '(') {
		s1.push(')');
	}
	else if (s[i] == '[') {
		s1.push(']');
	}
	else if (s[i] == '{') {
		s1.push('}');
	}
	if (s1.empty()) {
		return false;
	}
	else if (s1.top() == s[i]) {
		s1.pop();
	}
}
return s1.empty();

火车入栈问题

题意为根据入栈顺序判断能否给出指定的出栈顺序

用三个栈,一个栈为入栈顺序,一个栈为出栈顺序,一个辅助栈来模拟

根据入栈顺序,依次入栈,每入栈一个元素,就判断一下和当前出栈顺序的栈顶元素是否相同,如果不相同,接着按照入栈顺序往辅助栈里入元素,直到当前元素和出栈顺序的栈顶元素相同,就开始尝试出栈,直到当前元素和出栈顺序的栈顶元素不同,再接着入栈

可以有剪枝,就是如果原入栈是单调的,那么

最后如果入栈栈空了,辅助栈的栈顶元素和出栈栈的栈顶元素不同,那就是false

关于指定栈元素数量的出栈可能情况有多少种

思路1:根据第一个元素的出栈顺序,完成一次情况的划分

分析:1) 如果元素a在1号位置,那么只可能a进栈,马上出栈,此时还剩元素b、c、d等待操作,就是子问题f (3); 2) 如果元素a在2号位置,那么一定有一个元素比a先出栈,即有f (1)种可能顺序(只能是b),还剩c、d,即f (2), 根据乘法原理,一共的顺序个数为f (1) * f (2); 3) 如果元素a在3号位置,那么一定有两个元素比1先出栈,即有f (2)种可能顺序(只能是b、c),还剩d,即f (1), 根据乘法原理,一共的顺序个数为f (2) * f (1); 4) 如果元素a在4号位置,那么一定是a先进栈,最后出栈,那么元素b、c、d的出栈顺序即是此小问题的解,即 f (3); 结合所有情况,即f (4) = f (3) + f (2) * f (1) + f (1) * f (2) + f (3); 为了规整化,我们定义f (0) = 1;于是f (4)可以重新写为: f (4) = f (0)*f (3) + f (1)*f (2) + f (2) * f (1) + f (3)*f (0) 然后我们推广到n,推广思路和n=4时完全一样,于是我们可以得到: f (n) = f (0)*f (n-1) + f (1)*f (n-2) +... + f (n-1)*f (0)

第一个元素在几号位置,就说明在入栈栈紧邻的后面几个元素入了栈,由它确定一个栈区间(这个区间里除了第一个元素之外怎么出的不管,但是要保证第一个元素是这个区间最后一个出的),然后出栈消除掉。之后就是下一个剩余规模的的第一个元素出栈位置问题。

思路2:根据最后出栈的元素,完成一次情况的划分

1……k……n,第k个元素最后出栈的可能情况

k最后出栈,表明k入栈时,栈里没有元素,即k-1前的元素都已完成,和k之后的没关系,独立过程。同时表明,k出栈时,k后的元素都已完成出栈,即以k为端点确定了两个栈区间。

k之前怎么出的我不管,k之后怎么出的也不管,但是要保证没有出k,即k入栈后就一直没动过,直到都动完了最后再出k

前者是说k-1的规模,后者是说n-k(不包含k,即k+1到n,共有n-k-1+1个数)的规模,(相加即n-1,少的1就是k)

 

Catalan数 

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

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

相关文章

eSIM简介

翻译自eSIM eSIM eSIM被称为许多不同的名字。 有人说嵌入式SIM&#xff0c;有人说电子SIM和其他的说eSIM。 在行业标准最终确定并在该地区广泛采用之前&#xff0c;还会有其他名称出现。 无论我们称之为什么&#xff0c;此SIM的基本思想是将SIM&#xff08;UICC&#xff09;作为…

成绩查询解决方案

老师如果想要使用PHP代码创建一个查询系统&#xff0c;可以按照以下步骤进行操作&#xff1a; 建立数据库连接&#xff1a;首先&#xff0c;你需要使用PHP的数据库扩展&#xff08;如MySQLi或PDO&#xff09;来建立与数据库的连接。提供数据库的主机名、用户名、密码和数据库名…

实在智能携手40+央企,探索财务大模型及数智化实践与应用

“这次培训给我一个最大的感触就是&#xff0c;过去以为AI智能化、大模型技术是很高深的事情。但现在&#xff0c;我们通过RPA等数字化工具&#xff0c;自主根据自己的工作岗位&#xff0c;完成业务自动化流程的开发和设计。AI技术没有想象中的那么难入门。” 这是一位参加了“…

[答疑]角色和状态的区别

DDD领域驱动设计批评文集 “软件方法建模师”不再考查基础题 《软件方法》各章合集 jeri 2023-9-10 13:09 设备关联角色&#xff0c;设备也有子类&#xff08;车辆/设备&#xff09;&#xff0c;按书中的解释&#xff0c;设备是一个抽象类&#xff0c;角色类名像是带了状态…

第三天:实现网络编程基于tcp/udp协议在Ubuntu与gec6818开发板之间双向通信

互联网地址 每一台设备接入互联网后&#xff0c;都会举报一个唯一的地址编号 IP地址 INTERNET地址 internet地址 &#xff1a;它是协议上的一个逻辑地址 目前来说&#xff0c;我们主要的IP地址有两类 IPV4 IPV6 IPV4 其实就是使用一个32bit整数作为IP IPV6 其实就是使用一…

#循循渐进学51单片机#实例练习与经验累积#not.9

1、掌握不同类型变量转换的规则与字节操作进行位修改的技巧。 unsigned char a;unsigned int b;unsigned int c; 1)自动类型转换 2&#xff09;强制类型转换C &#xff08;unsigned long&#xff09;a*bl; C (unsigned long)(a*b); 3&#xff09;不同类型变量的赋值b a …

BabelEdit 5.0.1 Crack

BabelEdit加强软件本地化。BabelEdit 是处理 json、yaml、php、arb、vue、properties、resx 或 xliff 翻译文件的可靠解决方案。 旨在使开发过程更加简化和高效。 下载BabelEdit 5.0.0 对于Windows 也适用于macOS 和 Linux BabelEdit - 适用于 Web 和应用程序的翻译编辑器 (…

ps智能填充功能平替:alpaca的安装和使用

为了解决ps beta 智能填充无法使用的问题&#xff0c;需要用alpaca来平替&#xff0c;下面是安装教程&#xff1a; 安装方法&#xff1a; 1、下载插件。 alpaca插件汉化-夸克网盘https://pan.quark.cn/s/1168b447a44e#/list/share 2、 根据使用的PS版本&#xff0c;选择对应文件…

如何从外网远程控制企业内网电脑?

在企业中&#xff0c;保护公司机密和数据安全是至关重要的。为了确保员工在使用公司电脑时遵守相关规定&#xff0c;许多公司会采取外网监控员工电脑的方法。本文将介绍一些真实有效的方法和具体的操作步骤&#xff0c;以帮助您更好地监控员工电脑。 一、什么是外网监控&#x…

【Redis】Redis 的学习教程(十一)之使用 Redis 实现分布式锁

1. 分布式锁概念 在多线程环境下&#xff0c;为了保证数据的线程安全&#xff0c;锁保证同一时刻&#xff0c;只有一个可以访问和更新共享数据。在单机系统我们可以使用 synchronized 锁、Lock 锁保证线程安全。 synchronized 锁是 Java 提供的一种内置锁&#xff0c;在单个 …

北工大汇编——综合题(1)

题目要求 统计字符数。从键盘输入一行字符&#xff0c;统计字母、空格、数字、其他宇符的个数&#xff0c;并显示。要求&#xff1a;提示输入一行宇符串&#xff1b;键盘输入宇符串&#xff0c;Enter 键结束输入&#xff0c;并换行显示结果。 题目代码 DATAS SEGMENT;此处输…

Node.js 调用 fluent-ffmpeg

最近开发H5资源在线裁剪&#xff0c;最终在资源合成的步骤&#xff0c;选择 ffmpeg 作为合成的插件&#xff0c;记录下使用方式。 一、介绍 ffmpeg 一款跨平台多媒体处理工具&#xff0c;可以进行视频转码、裁剪、合成、音视频提取、推流等操作。 二、安装 Node js 可以利用…

qt+ffmpeg视频播放器实现音视频倍速功能

目录 一、前言 二、开发环境参考源码 开发环境&#xff1a; 参考源码&#xff1a; 三、添加倍速控件 四、倍速调节代码 五、视频倍速调节 六、音频倍速方案一 七、音频倍速方案二 八、最终效果 九、参考文献 十、结语 一、前言 参考了云天之巅的FFMPEG Qt视频播放器…

Tomcat常见报错以及手动实现Tomcat

一.Tomcat的简单启动 1.安装Tomcat 2.Tomcat启动 1. 双击 bin 目录下的 startup.bat 文件 2. 输入 http://localhost:8080/&#xff0c;显示如下界面代表安装成功, 默认在 8080 端口 3. 注意&#xff0c;不要关闭黑窗口&#xff0c;关闭了&#xff0c;tomcat 服务就停止了…

LabVIEW开发基于物联网的多功能功率分析仪

LabVIEW开发基于物联网的多功能功率分析仪 根据技术规则&#xff0c;电气元件网络中的单个被创建为在标称正弦波振动制造频率下运行。失真顺序的电流和电压波与正弦波不同&#xff0c;它们或多或少地扭曲成形状。它是由交流网络中非线性组件的存在引起的&#xff0c;例如静态转…

R语言进行孟德尔随机化+meta分析(1)---meta分析基础

目前不少文章用到了孟德尔随机化meta分析&#xff0c;今天咱们也来介绍一下&#xff0c;孟德尔随机化meta其实主要就是meta分析的过程&#xff0c;提取了孟德尔随机化文章的结果&#xff0c;实质上就是个meta分析&#xff0c;不过多个孟德尔随机化随机化的结果合并更加加强了结…

月木学途开发 4.公告模块

概述 效果图 数据库设计 DROP TABLE IF EXISTS announcement; CREATE TABLE announcement (announcementId int(11) NOT NULL AUTO_INCREMENT,announcementTitle varchar(255) DEFAULT NULL,announcementTime varchar(255) DEFAULT NULL,announcementContent longtext,PRIMAR…

计算机组成原理——基础入门总结(二)

上一期的路径&#xff1a;基础入门总结&#xff08;一&#xff09; 目录 一.输入输出系统和IO控制方式 二.存储系统的基本概念 三.cache的基本概念和原理 四.CPU的功能和基本结构 五.总线概述 一.输入输出系统和IO控制方式 IO设备又可以被统一称为外部设备~ IO接口&…

Jetpack:在数据变化时如何优雅更新Views数据

本文讲的是关于Jetpack的架构组件LiveData&#xff0c;LiveData是Lifecycle-aware 组件的一个应用&#xff0c;这意味着LiveData遵守Activity、Fragment和Service等组件的生命周期&#xff0c;在它们生命周期处于活跃状态&#xff08;CREATED和RESUMED&#xff09;才进行更新Vi…

《计算机视觉中的多视图几何》笔记(8)

8 More Single View Geometry 本章主要讲述除了点以外的几何体&#xff0c;在投影变换下的性质。这些几何体包括&#xff1a;平面&#xff0c;线&#xff0c;圆锥曲线&#xff0c;二次曲线。 讲到这里就明白了&#xff0c;为什么投影几何这么重要&#xff0c;因为摄像机就是一…