当前位置: 首页 > 编程日记 > 正文

算法模板之栈图文详解


一. ⛳️模拟栈

1.1 🔔用数组模拟实现栈

1.1.1 👻栈的定义

栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。如下图是栈的示意图:
在这里插入图片描述

1.1.2 👻向栈顶插入一个数 x(进栈操作)

根据栈的定义可知,我们可以将数组看作是横放的栈的示意图,即将数组的首元素位置看作栈底、当前元素的位置看作栈顶,便可以实现数组模拟栈的相关操作。如果我们要向栈顶插入一个元素,将栈顶指针向后移动一位将元素插入进去即可。如下图所示:
在这里插入图片描述
代码展示(建议结合图示看注释):

//top表示栈顶
int stk[N], top = -1;

// 向栈顶插入一个数x
stk[++top] = x;

1.1.3 👻从栈顶弹出一个元素(出栈操作)

根据上面所知,如果我们要从栈顶弹出一个元素,我们只需要将栈顶指针向前移动一位即可。如下图所示:
在这里插入图片描述
代码展示(建议结合图示看注释):

// 从栈顶弹出一个数
top--;

1.1.4 👻判断栈是否为空

根据上面所知,如果我们要判断栈是否为空,我们只需要判断栈顶指针是否指向数组首元素左边的位置(即判断top是否等于-1位置)。如下图所示:
在这里插入图片描述
代码展示(建议结合图示看注释):

// 判断栈是否为空,如果 top >= 0,则表示不为空
if (top >= 0)
{
	//输出栈不为空	
}
else
{
	//输出栈为空
}

1.1.5 👻查询栈顶元素

根据下图所示,查询栈顶元素只需要输出数组下标为top的值即可;
在这里插入图片描述
代码展示(建议结合图示看注释):

// 栈顶的值
stk[top];

1.2 🌟模板提取(重点)🌟

C++代码:

// top表示栈顶
int stk[N], top = -1;

// 向栈顶插入一个数x
stk[++top] = x;

// 从栈顶弹出一个数
top-- ;

// 栈顶的值
stk[top];

// 判断栈是否为空,如果 top >= 0,则表示不为空
if (top >= 0)
{
	//输出栈不为空	
}
else
{
	//输出栈为空
}


二. ⛳️题目练习

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

2.1 题目

在这里插入图片描述

2.2 输入样例

10
push 5
query
push 6
pop
query
pop
empty
push 4
query
empty

2.3 输出样例

5
5
YES
4
NO

2.4 c++代码

#include <iostream>

using namespace std;

const int N = 100010;
int stk[N], top = -1;

int main()
{
    int m = 0;
    cin >> m;
    
    while(m--)
    {
        string s;
        cin >> s;
        if(s == "push")
        {
            //在栈顶插入一个元素
            int x = 0;
            cin >> x;
            stk[++top] = x;
        }
        else if(s == "pop")
        {
            //从栈顶弹出一个元素
            top--;
        }
        else if(s == "empty")
        {
            //判断栈是否为空
            cout << (top >= 0 ? "NO":"YES" ) << endl;
        }
        else
        {
            //查询栈顶元素
            cout << stk[top] << endl;
        }
    }
    
    return 0;
}

相关文章:

深入理解 Nginx 工作原理:Master-Worker 架构与性能优化

Nginx是一个高性能的开源 Web 服务器,以其卓越的性能、高并发处理能力和可扩展性而闻名。其独特的工作方式及架构设计为 Web 服务器领域带来了创新。本文将深入探讨 Nginx 的工作原理,重点关注其 Master-Worker 架构以及性能优化策略,帮助大家更好地理解 Nginx 如何处理并发请求并实现高效的网络服务。

讲解only one element tensors can be converted to Python scalars

在使用PyTorch时,当遇到 "only one element tensors can be converted to Python scalars" 错误消息时,我们需要确认张量中元素的数量。如果张量包含多个元素,我们应该使用索引来访问特定元素,或者使用其他方法来处理整个张量。如果张量只有一个元素,我们可以使用.item()方法将其转换为Python标量。如果需要将整个张量转换为Python列表,并且确保张量只有一个元素,可以使用.tolist()方法。

讲解Unknown: Failed to get convolution algorithm. This is probably because cuDNN

"Unknown: Failed to get convolution algorithm. This is probably because cuDNN"错误通常与cuDNN库的卷积算法获取失败有关。在解决这个错误时,你需要注意cuDNN库的版本兼容性,确保正确安装和设置cuDNN库,以及更新GPU驱动程序。如果问题仍然存在,你可以尝试重新编译深度学习框架。希望本文对你解决该错误提供了一些帮助和指导。

讲解pyqt5 opengl demo

当用户点击鼠标左键时,在OpenGL窗口中绘制一个红色的点,并更新显示。PyQt5和OpenGL结合可以实现更复杂的图形和动画效果,让你的应用更加生动和互动。你可以进行进一步的修改和自定义,添加更多的绘图功能和 OpenGL 特性。PyQt5 提供了强大的功能和灵活性,可以帮助你创建具有交互性的图形应用程序。Qt是一个跨平台的应用程序开发框架,提供了丰富的工具和组件,可以用于构建用户友好和功能强大的应用程序。实际应用场景:创建一个简单的二维图形绘制工具,使用 PyQt5 和 OpenGL 实现。

讲解UserWarning: Update your Conv2D

Conv2D"告警信息是在旧版深度学习框架中使用较新的CNN模型时常见的问题。通过查阅官方文档并根据指导更新代码,我们能够适应新的API、参数或者用法,确保模型的正确性和性能。由于不同的框架和版本有所不同,我们需要根据具体情况来解决这个问题。及时更新框架和代码,保持与最新和推荐的版本保持同步,是进行深度学习研究和开发的重要环节。

讲解RuntimeError: dimension specified as 0 but tensor has no dimensions

是一个常见的错误,它通常在尝试操作一个没有维度的张量时发生。我们可以通过检查张量的元素数量或使用 if 判断来避免这个错误。无论你选择哪种方法,都要确保在操作之前进行维度检查,确保张量不为空。这样可以避免出现运行时错误,并使你的代码能够正确运行。希望这篇文章能够帮助你理解和解决错误,并提高你的深度学习和机器学习代码的健壮性。如果你还有其他相关问题,请随时提问!

java并发编程六 共享模型之内存

因为 t 线程要频繁从主内存中读取 run 的值,JIT 编译器会将 run 的值缓存至自己工作内存中的高速缓存中,减少对主存中 run 的访问,提高效率。1 秒之后,main 线程修改了 run 的值,并同步至主存,而 t 是从自己工作内存中的高速缓存中读取这个变量的值,结果永远是旧值。这种情况下是:线程2 执行 ready = true,切换到线程1,进入 if 分支,相加为 0,再切回线程2 执行 num = 2。I_Result 是一个对象,有一个属性 r1 用来保存结果,问,可能的结果有几种?

java并发编程七 无锁解决加锁问题

有如下需求,保证 account.withdraw 取款方法的线程安全。首先想到的是给 Account 对象加锁。原有实现并不是线程安全的。withdraw 方法。

C#中var、object和dynamic的区别

在C#中,var、object和dynamic这三个关键字具有不同的特性和用途。var关键字用于隐式类型推断,编译时确定变量类型,一旦确定后不能更改。object关键字是C#中的基础类型,可以保存任意类型的数据,但需要进行装箱和拆箱操作,并且需要显式类型转换才能获取原始数据。dynamic关键字用于动态类型,变量类型可以在运行时推断并更改,避免了显式类型转换的繁琐,但会带来一些性能开销和运行时错误的风险。根据具体的需求和场景,选择合适的关键字进行变量声明和操作是编写高效和可读性良好代码的关键。

本地配置Java支付宝沙箱环境模拟支付并内网穿透远程调试

在沙箱环境调试支付SDK的时候,往往沙箱环境部署在本地,局限性大,在沙箱环境中有多种支付场景,往往是多人联合开发,本地环境可能无法满足异地联合,所以把本地环境变成公网环境下进行调试开发会更好。本次教程,我们将使用支付宝平台提供的沙箱环境,在本地配置测试模拟支付,并做内网穿透,通过cpolar穿透内网,实现在公网环境下的远程访问,无需公网IP,也无需配置路由器。

MySQL是如何保证数据不丢失的?

上篇文章《InnoDB在SQL查询中的关键功能和优化策略》对InnoDB的查询操作和优化事项进行了说明。但是,MySQL作为一个存储数据的产品,怎么确保数据的持久性和不丢失才是最重要的,感兴趣的可以跟随本文一探究竟。

Django 防止 XSS 跨站脚本攻击

跨站脚本攻击(XSS)是 Web 应用中常见的安全漏洞,它允许攻击者在用户浏览器中执行恶意脚本。在 Django 开发中,了解并防御 XSS 攻击至关重要。本文将详细介绍 XSS 攻击的工作原理,Django 中的防御机制,以及如何在 Django 应用中实施有效的防御措施。

讲解TypeError: expected str, bytes or os.PathLike object, not generator

错误消息说明你将生成器对象传递给一个期望接收字符串、字节或文件路径对象的函数。解决该问题的方法包括转换生成器为列表、在生成器内部使用其值、将生成器对象转换为字符串或字节,以及检查函数文档。希望本文能帮助你解决这个错误并更好地理解在Python编程中处理生成器对象的方法。

讲解Invalid character escape ‘\o‘.

通过字符转义,我们可以在字符串中插入特殊字符、控制字符或非打印字符,以及表示一些无法通过键盘输入的字符。字符转义在计算机编程中是一个重要的概念,它允许我们表示一些特殊字符和字符编码,从而扩展了字符串的功能和灵活性。加倍,你可以解决这个问题,并将其转换为一个普通的字符。记住,在遇到类似问题时,查找无效的转义序列,并确保使用双反斜杠来表示反斜杠字符本身。总结来说,当编写字符串时,如果你遇到了"Invalid character escape '\o'"这样的问题,说明你使用了一个无效的转义序列。

讲解cv2‘ has no attribute ‘gapi_wip_gst_GStreamerPipeline‘错误解决方法

在使用OpenCV库中的cv2模块进行图像处理时,遇到"cv2 'has no attribute 'gapi_wip_gst_GStreamerPipeline'"错误提示可能是由于OpenCV库版本问题或者代码错误导致的。更新OpenCV库到最新版本。检查并修改代码,确保正确导入cv2模块和正确使用相关函数或类。尝试使用其他cv2库的功能替代。希望本文对解决"cv2 'has no attribute 'gapi_wip_gst_GStreamerPipeline'"错误问题有所帮助。

讲解CUBLAS_STATUS_NOT_INITIALIZED解决

在使用CUBLAS库进行GPU加速的线性代数运算时,出现CUBLAS_STATUS_NOT_INITIALIZED错误是比较常见的问题。在使用CUDA加速库时,特别是在使用CUBLAS库进行GPU加速的线性代数运算时,有时我们可能会遇到CUBLAS_STATUS_NOT_INITIALIZED错误。在本篇文章中,我们将深入探讨这个错误的原因,并给出解决方法。CUBLAS_STATUS_NOT_INITIALIZED错误的主要原因是在调用CUBLAS函数之前未正确初始化CUBLAS库。

讲解Cause: invalid code lengths set

在理解"invalid code lengths set"错误之前,先来了解一下Huffman编码的基本原理。Huffman编码是一种无损数据压缩算法,通过对数据中的符号进行变长编码来实现压缩。这种编码方式基于符号出现频率的统计信息,将出现频率较高的符号用较短的编码表示,而出现频率较低的符号则用较长的编码表示。统计所有符号的出现频率;根据频率构建一个频率树,以频率作为树的权值;通过树的节点路径来确定每个符号的编码,经常使用0表示向左走,1表示向右走。

java并发编程四 Monitor 概念,api介绍与线程状态转换

obj.wait() 让进入 object 监视器的线程到 waitSet 等待obj.notify() 在 object 上正在 waitSet 等待的线程中挑一个唤醒obj.notifyAll() 让 object 上正在 waitSet 等待的线程全部唤醒它们都是线程之间进行协作的手段,都属于 Object 对象的方法。必须获得此对象的锁,才能调用这几个方法log.debug("执行....");// 让线程在obj上一直等待下去。

java并发编程五 ReentrantLock,锁的活跃性

一间大屋子有两个功能:睡觉、学习,互不相干。现在小南要学习,小女要睡觉,但如果只用一间屋子(一个对象锁)的话,那么并发度很低解决方法是准备多个房间(多个对象锁)将锁的粒度细分。

ping命令详解

ping (Packet Internet Groper)是一种因特网包探索器,用于测试网络连接量的程序。Ping是工作在[ TCP/IP](https://baike.baidu.com/item/ TCP%2FIP/214077?fromModule=lemma_inlink)网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送[ ICMP](https://baike.baidu.com/item/ ICMP/572452?

where查询条件的字段顺序打乱会影响命中索引吗?

答案是:不影响我们的where后边条件字段打乱会影响命中索引吗?先来进行下边的实验:可以看到实验结果,where条件字段顺序没有按照索引的字段顺序,依然不影响命中索引。因为Mysql中有查询优化器,会自动优化查询顺序。

将AP-10K数据集Json格式转成Yolov8-Pose姿态的txt格式

class-index>是对象的类的索引,<x> <y> <width> <height>是边界框的坐标,<px1> <py1> <px2> <py2> ... <pxn> <pyn>是关键点的像素坐标。这样就将AP-10K数据集Json格式转成Yolov8-Pose的txt格式了。将txt的信息可视化在图片上进行验证。检查生成的txt是否准确。

使用Linux安装RStudio Server并实现远程访问

本文主要讲解如何使用Linux docker安装RStudio Server并实现远程访问

一款跨空间、跨平台、能分享、能搜索常用文件内容、能识别图片文字的全能搜索工具

多可文件快搜安装简单,无需复杂配置。安装在本机后,不仅能搜索本机文件,还可以搜索局域网内共享文件。它可以搜索NAS(SMB协议)上的文件。就连存储在阿里云OSS里的文件,也能轻松搜索到。它还支持IPv6,使用户可以快速安全地搜索网络中的文件。

文档管理系统的核心技术与难点

概述网上有非常多的“文档管理系统”,随便搜索就能得到超过1000种大大小小的软件或系统,谓之“铺天盖地”也不为过。其中绝大多数是近几年用各类开源的所谓组件、框架搭起来的七拼八凑的产物,其花哨无比的言辞与看似不错的截图,会造成很多用户茫然,掏钱购买后基本上都感觉交了智商税。那么到底什么样的系统才能称为“文档管理系统”呢?怎么选择比较安全呢?先回答第二个问题:世界上任何一个能用的软件至少需要5年的基本成长期。所以,选购的时候,5年以内的软件,就不要考虑了。后面是几个基本概念。文档管理也是各类信息系统

java并发编程四 synchronized锁对象分析和变量线程线程安全分析

这里说它们是线程安全的是指,多个线程调用它们同一个实例的某个方法时,是线程安全的。所谓的“线程八锁”,其实就是考察 synchronized 锁住的是哪个对象。成员变量和静态变量是否线程安全?局部变量是否线程安全?

java并发编程三 共享内存的问题和synchronized解决方案

老王说 [ 小南,你的时间到了,该别人了,记住结果走吧 ],于是小南念叨着 [ 结果是1,结果是1…最近执行的计算比较复杂,需要存储一些中间结果,而学生们的脑容量(工作内存)不够,所以老王申请了一个笔记本(主存),把一些中间结果先记在本上。这时小女的时间也用完了,老王又叫醒了小南:[小南,把你上次的题目算完吧],小南将他脑海中的结果 1 写入了笔记本。老王说 [ 小女,该你了 ],小女看到了笔记本上还写着 0 做了一个 -1 运算,将结果 -1 写入笔记本。但是由于分时系统,有一天还是发生了事故。

讲解Unable to get repr for<class‘torch.Tensor‘>

当然,这只是一个示例,实际应用中我们可以根据自己的需要和场景进行更详细和适当的定制。在深度学习任务中,张量是构建和训练模型的基础,对于熟悉和掌握张量的操作非常重要。张量是 PyTorch 中进行数值计算的基本单位,它类似于 NumPy 中的多维数组,但具有额外的功能和优化,可以在 GPU 上加速计算。PyTorch 中的张量可以与计算图一起使用,计算图是在深度学习中用于自动求导和反向传播的重要概念。方法,我们可以根据具体情况提供更有用的信息,以便更好地理解和调试我们的自定义张量类或模型类。

讲解python 图像数据类型及颜色空间转换

通过上述示例代码,我们可以将彩色图像转换为HSV颜色空间,并设置红色目标区域的颜色范围。颜色空间转换是一种将一种颜色表示方式转换为另一种颜色表示方式的过程。不同的颜色空间在表示颜色和对颜色的处理上有各自的特点和优势。本文介绍了Python中的常见图像数据类型以及灰度化、RGB到HSV转换和颜色阈值分割等常见颜色空间转换。本文将深入探讨Python中的图像数据类型,以及如何进行常见的颜色空间转换。颜色空间转换是图像处理中常见的操作之一。根据具体的需求,你可以使用不同的库和方法来进行更复杂的颜色空间转换。