算法学习06:数组模拟:单/双链表,栈和队列,单调栈/队列

算法学习06:数组模拟:单/双链表,栈和队列,单调栈/队列


文章目录

  • 算法学习06:数组模拟:单/双链表,栈和队列,单调栈/队列
  • 前言
  • 一、链表
    • 1.单链表
    • 2.双链表
  • 二、栈和队列
    • 1.普通栈、队列
    • 2.单调栈
    • 3.单调队列
  • 三、 拓展:ios::sync_with_stdio(false) 和 cin.tie(0) 对cin,cout速率的影响:
  • 总结


前言

在这里插入图片描述


提示:以下是本篇文章正文内容:

一、链表



在这里插入图片描述



1.单链表

在这里插入图片描述



在这里插入图片描述



#include <iostream>using namespace std;const int N = 100000 + 10;//head:表示头结点的下标
//e[i]:表示结点i的值
//ne[i]:表示结点i的next指针是多少
//idx:存储当前已经用到了那个点(从0开始)
int head, e[N], ne[N], idx;//初始化:
void init()
{head = -1;idx = 0;} //将x插入到头结点:
void add_to_head(int x)
{e[idx] = x;ne[idx] = head;head = idx;idx ++;} // 将x插入到下标是k的点后面:void add(int k, int x){e[idx] = x;ne[idx] = ne[k];ne[k] = idx;idx ++;} // 将下标是k的点后面的点删除
void remove(int k)
{ne[k] = ne[ne[k]];} int main()
{int m;cin >> m;init();while(m --){char op;int x, k;cin >> op;if(ip == 'H'){cin >> x;add_to_head(x);}else if(ip == 'D'){cin >> k;if(!k) head = ne[head];//注意1:删除头结点 remove(k - 1);}else{cin >> k >> x;add(k - 1, x);}}for(int i - head; i != -1; i = ne[i]) cout << e[i] << ' ';cout << endl;return 0;
}


2.双链表



在这里插入图片描述



在这里插入图片描述



在这里插入图片描述



#include <iostream>using namespace std;const int N = 100000 + 10;int m;
int e[N], l[N], r[N], idx;//初始化:
void init()
{//0表示左端点,1表示右端点r[0] = 1, l[1] = 0;idx = 2; } //在下标是k的结点后,插入x : 
void add(int k, int x)
{e[idx] = x;r[idx] = r[k];//idx的右边 l[idx] = k;//idx的左边 l[r[k]] = idx;//k右边结点的左边 r[k] = idx;//k的右边 
}//删除第k个点:
void remove(int k)
{r[l[k]] = r[k];//k左边节点的右边,连接k的右边的结点 l[r[k]] = l[k];//k右边结点的左边,连接k的左边的结点 } 


二、栈和队列

1.普通栈、队列



在这里插入图片描述



#include <iostream>using namespace std;const int N = 100000 + 10;// ***************************栈:int stk[N], tt;//stk:栈, tt:栈顶//插入:
stk[++ tt] = x;//从 1 开始//弹出:
tt --;// 判断栈是否为空:(伪代码)
if(tt > 0) not empty;
else empty;// 栈顶 :
stk[tt];// ***************************队列:
int q[N], hh, tt = -1;//hh:对头, tt:对尾// 插入:
q[++ tt] = x; // 弹出:
hh ++;// 判断队列是否为空:
if(hh <= tt) not empty;
else empty;// 取出对头元素: 
q[hh];


2.单调栈

例题:给一个长度为N的整数序列,输出每个数昨天第一个比他小的数,如果不存在就输出-1。



在这里插入图片描述



在这里插入图片描述



//例题:给一个长度为N的整数序列,输出每个数昨天第一个比他小的数,
//如果不存在就输出-1。
#include <iostream>using namespace std;const int N = 100000 + 10;int n;
int stk[N], tt;int main()
{cin >> n;for(int i = 0; i < n; i ++){int x;cin >> x;//单调栈 //在我们维护的栈中,移去比当前数“x”大的数 while(tt & stk[tt] >= x) tt--;//此时,栈顶元素就是 最近的 小于x的数if(tt) cout << stk[tt] << endl;else cout << -1 << end;stk[++ tt] = x;//将x进栈,仍然可以维护 单调栈。 }return 0;
}

3.单调队列

题目:给定一个大小为n<=10^6的数组,有一个大小为k的滑动窗口,它从数组的最左边移动感到最右边,你只能找窗口中看到k个数字。
你的任务是确定滑动窗口位于每个位置是,窗口中的最小值和最大值。



在这里插入图片描述


//题目:给定一个大小为n<=10^6的数组,有一个大小为k的滑动窗口,
//它从数组的最左边移动感到最右边,你只能找窗口中看到k个数字。
//你的任务是确定滑动窗口位于每个位置是,窗口中的最大值和最小值。#include <iostream>using namespace std;const int N = 100000 + 10;int n, k;
int a[N], q[N];//q:队列,队列存储的是 下标 int main()
{scanf("%d%d", &n, &k);for(int i = 0; i < n; i ++) scnaf("%d", %a[i]);//窗口中的最小值int hh = 0, tt = -1;for(int i = 0; i < n; i ++) {//判断对头是否已经 划出窗口://使用if?每次移动一格。 if(hh <= tt && i - k + 1 > q[hh]) hh ++; //将窗口内大于的元素 出队列(为什么从后面出队列?分析题目所得。while(hh <= tt && a[q[tt] >= a[i]]) tt --;q[++ tt] = i;//要先加入,i对应的值可能是最小的 if(i >= k - 1) printf("%d", a[q[hh]]);	} put(" "); //窗口中的最大值int hh = 0, tt = -1;for(int i = 0; i < n; i ++) {//判断对头是否已经 划出窗口:if(hh <= tt && i - k + 1 > q[hh]) hh ++;while(hh <= tt && a[q[tt] <= a[i]]) tt --;q[++ tt] = i;//i对应的值可能是最大的 if(i >= k - 1) printf("%d", a[q[hh]]);	} put(" "); return 0;} 


三、 拓展:ios::sync_with_stdio(false) 和 cin.tie(0) 对cin,cout速率的影响:

拓展:关于输入的速率问题
(1)cin,cout (1394ms)
(2)scanf,printf (133ms)
(3)ios::sync_with_stdio(false); + cin (1182ms)
(4)cin.tie(0); (141ms)
应用别人的博客来解释cin,cout的速率问题😍


总结

提示:这里对文章进行总结:
💕💕💕

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

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

相关文章

docker安装ES、LogStash、Kibana

文章目录 一、安装Elasticsearch1. 安装Elasticsearch2. 安装IK分词器3. elasticsearch-head 监控的插件4. 配置跨域 二、安装LogStash三、安装kibana四、SpringBoot集成LogStash&#xff0c;将日志输出到ES中五、 启动项目&#xff0c;监控项目运行 提示&#xff1a;以下是本篇…

C++:模版进阶 | Priority_queue的模拟实现

创作不易&#xff0c;感谢三连支持 一、非类型模版参数 模板参数分类为类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&…

JavaScript高级Ⅱ(全面版)

接上文 JavaScript高级Ⅰ JavaScript高级Ⅰ(自认为很全面版)-CSDN博客 目录 第2章 DOM编程 2.1 DOM编程概述 2.1.4 案例演示(商品全选) 2.1.5 dom操作内容 代码演示&#xff1a; 运行效果&#xff1a; 2.1.6 dom操作属性 代码演示&#xff1a; 运行效果&#xff1a; 2…

大模型时代下的自动驾驶研发测试工具链-SimCycle

前言&#xff1a; 最近OpenAI公司的新产品Sora的发布&#xff0c;正式掀起了AI在视频创作相关行业的革新浪潮&#xff0c;AI不再仅限于文本、语音和图像&#xff0c;而直接可以完成视频的生成&#xff0c;这是AI发展历程中的又一座重要的里程碑。AI正在不断席卷着过去与我们息…

STM32 学习10 PWM输出

STM32 学习10 PWM输出 一、PWM简介1. PWM的概念2. PWM的工作原理3. PWM 常用的应用场景 二、一些概念1. 频率2. 占空比 三、STM32F1 PWM介绍1. 定时器与寄存器&#xff08;1&#xff09;**自动重装载寄存器&#xff08;ARR&#xff09;**&#xff1a;&#xff08;2&#xff09;…

python基础——输入与输出【input 和 print】

&#x1f4dd;前言&#xff1a; 上一篇文章python基础——入门必备知识中讲解了一些关于python的基础知识&#xff0c;可以让我们更好的理解程序代码中内容的含义&#xff0c;不至于一头雾水。今天我就来介绍一下&#xff0c;python中两个常见的输入和输出语句 input 和 print …

产品推荐 - 基于星嵌 OMAPL138+国产FPGA的DSP+ARM+FPGA三核开发板

1 评估板简介 基于TI OMAP-L138&#xff08;定点/浮点DSP C674xARM9&#xff09; FPGA处理器的开发板&#xff1b; OMAP-L138是TI德州仪器的TMS320C6748ARM926EJ-S异构双核处理器&#xff0c;主频456MHz&#xff0c;高达3648MIPS和2746MFLOPS的运算能力&#xff1b; FPGA…

粘包与拆包

优质博文&#xff1a;IT-BLOG-CN 一、粘包出现的原因 服务端与客户端没有约定好要使用的数据结构。Socket Client实际是将数据包发送到一个缓存buffer中&#xff0c;通过buffer刷到数据链路层。因服务端接收数据包时&#xff0c;不能断定数据包1何时结束&#xff0c;就有可能出…

【操作系统概念】第11章:文件系统实现

文章目录 0.前言11.1 文件系统结构11.2 文件系统实现11.2.1 虚拟文件系统 11.3 分配方法11.3.1 连续分配11.3.2 链接分配11.3. 3 索引分配 11.5 空闲空间管理11.5.1 位图/位向量11.5.2 链表11.5.3 组 0.前言 正如第10章所述&#xff0c;文件系统提供了机制&#xff0c;以在线存…

springboot251基于springboot-vue的毕业论文管理系统

毕业论文管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本毕业论文管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短…

视频批量混剪剪辑,批量剪辑批量剪视频,探店带货系统,精细化顺序混剪,故事影视解说,视频处理大全,精细化顺序混剪,多场景裂变,多视频混剪

前言 工具的产生源于dy出的火山引擎的云视频混剪制作是按分钟数收费的&#xff0c;这个软件既能实现正常混剪也能避免二次收费。属于FFMPEG合成的。 欢迎大家给一些好的建议和功能&#xff0c;回复可见&#xff0c;附加了一些天卡&#xff0c;周卡&#xff0c;请大家不要一人占…

JavaSec 基础之 URLDNS 链

文章目录 URLDNS 链分析调用链复现反序列化复现 URLDNS 链分析 URLDNS是ysoserial里面就简单的一条利用链&#xff0c;但URLDNS的利用效果是只能触发一次dns请求&#xff0c;而不能去执行命令。比较适用于漏洞验证这一块&#xff0c;而且URLDNS这条利用链并不依赖于第三方的类…

练习3-softmax分类(李沐函数简要解析)与d2l.train_ch3缺失的简单解决方式

环境为:练习1的环境 网址为:https://www.bilibili.com/video/BV1K64y1Q7wu/?spm_id_from333.1007.top_right_bar_window_history.content.click 代码简要解析 导入模块 导入PyTorch 导入Torch中的nn模块 导入d2l中torch模块 并命名为d2l import torch from torch import nn…

Neo4j安装 Linux:CentOS、openEuler 适配langchain应用RAG+知识图谱开发 适配昇腾910B

目录 Neo4j下载上传至服务器后进行解压运行安装JAVA再次运行在windows端打开网页导入数据 Neo4j下载 进入Neo4j官网下载页面 向下滑动找到 Graph Database Self-Managed 选择 社区版&#xff08;COMMUNITY&#xff09; 选择 Linux / Mac Executable Neo4j 5.17.0 (tar) 单机下…

分销商城微信小程序:用户粘性增强,促进复购率提升

在数字化浪潮的推动下&#xff0c;微信小程序作为一种轻便、高效的移动应用形式&#xff0c;正成为越来越多企业开展电商业务的重要平台。而分销商城微信小程序的出现&#xff0c;更是为企业带来了前所未有的机遇。通过分销商城微信小程序&#xff0c;企业不仅能够拓宽销售渠道…

产品推荐 - 基于矽海达 SEM9363的无线数字图传编码开发板

Sihid SEM9363无线数字图传编码调制板(A版本)通过HDMI接口输入高清数字视频到Hi3516A处理器做H.264压缩编码&#xff0c;压缩后的视频信号通过FPGA实现COFDM信道调制&#xff0c;再经AD936x转换为模拟信号调制发射出去。 SEM9363板功能与技术规格 通过Micro HDMI接口输入数字视…

生活的色彩--爱摸鱼的美工(17)

题记 生活不如意事十之八九&#xff0c; 恶人成佛只需放下屠刀&#xff0c;善人想要成佛却要经理九九八十一难。而且历经磨难成佛的几率也很小&#xff0c;因为名额有限。 天地不仁以万物为刍狗&#xff01; 小美工记录生活&#xff0c;记录绘画演变过程的一天。 厨房 食…

AI探索实践12 - Typescript开发AI应用4:大模型响应数据的格式化输出

大家好&#xff0c;我是feng&#xff0c;感谢你阅读我的博文&#xff0c;如果你也关注AI应用开发&#xff0c;欢迎关注公众号和我一起​探索。如果文章对你有所启发&#xff0c;请为我点赞&#xff01; 一、重点回顾 在介绍本文之前的文章中&#xff0c;我们先来回顾一下使用L…

两天学会微服务网关Gateway-Gateway过滤器

锋哥原创的微服务网关Gateway视频教程&#xff1a; Gateway微服务网关视频教程&#xff08;无废话版&#xff09;_哔哩哔哩_bilibiliGateway微服务网关视频教程&#xff08;无废话版&#xff09;共计17条视频&#xff0c;包括&#xff1a;1_Gateway简介、2_Gateway工作原理、3…

数据结构 - 栈和队列

本篇博客将介绍栈和队列的定义以及实现。 1.栈的定义 栈是一种特殊的线性表&#xff0c;只允许在固定的一端进行插入和删除数据&#xff0c;插入数据的一端叫做栈顶&#xff0c;另一端叫做栈底。栈中的数据遵守后进先出的原则 LIFO (Last In First Out)。 插入数据的操作称为压…