算法一看就懂之「 堆栈 」

       戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=png

今天咱们再来继续看看「 堆栈 」吧,我写技术文章很少 show code,所以经常有人吐槽。好吧,这个算法系列的文章我打算每一篇的结尾处都找一道算法题写出代码示例,这总可以了吧。

一、「 堆栈 」是什么?

堆栈(stack)是一种先进后出的、操作受限的线性表,也可以直接称为栈。

640?wx_fmt=png

可以把栈想象成一个桶一样,往这个桶里面一层一层的放东西,先放进去的在里面,后放进去的东西依次在外面。但取东西的时候就是先取靠近外面的,再依次一层层取里面的。这就是 后进先出( Last In-First Out )的原则。

因此「 栈 」虽然是线性的,有2个端:顶端和底端,但它只允许从一端进行插入和删除数据,这就是为啥前面说「 栈 」是操作受限的了。

栈只有两种操作:Push 和 Pop 。我们用Push(压入)来表示往栈中插入数据,也叫入栈,用Pop(弹出)来表示从栈中删除数据,也叫出栈。我们可以既可以用 「 数组 」 来实现一个栈,也可以用 「 链表 」 来实现一个栈。

用数组实现的栈,叫做顺序栈:
顺序栈的实现非常简单,这里就不写代码了,写一下思路。先初始化一个数组,然后再用一个变量给这个数组里的元素进行计数,当有新元素需要入栈的时候,将这个新元素写入到数组的最后一个元素的后面,然后计数器加一。当需要做出栈操作时,将数组中最后一个元素返回,计数器减一。

当然在入栈前需要判断数组是否已经满了,如果数组大小等于计数器大小,则表明数组是满的。

出栈的时候也需要判断数组是不是空数组,如果计数器是0,则表明数组是空的。

从上面的实现流程可以看出,通过数组实现的栈,其入栈和出栈都是对单个元素进行操作,因此其入栈和出栈的时间复杂度都是O(1),并且其入栈和出栈操作并没有额外开销更多空间,因此其空间复杂度也是O(1)的。

用链表实现的栈,叫做链式栈:
实现思路是先定义一个链表节点的类,基于这个类去定义一个头节点Head。当有新元素需要入栈的时候,将这个新元素的Next指针指向头结点Head的Next节点,然后再将Head的Next指向这个新节点。当需要做出栈操作时,直接将Head所指向的节点返回,同时让Head指向下一个节点。
当然,在入栈和出栈时都需要判断链表是否为空的情况。
链式栈的入栈和出栈都是在处理头部节点,所以操作很简单,其时间和空间复杂度均为O(1)。

二、「 堆栈 」的算法实践?

我们来看一个基于用 栈 来完成的 算法题(来源leetcode):	算法题:给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。	
有效字符串需满足:	左括号必须用相同类型的右括号闭合。	左括号必须以正确的顺序闭合。	举例:字符串 "()"有效、"()[]{}"有效、"(]"无效、"([)]"无效、"{[]}"有效。	解题思路:	
使用1个堆栈即可解决,依次遍历这个字符串,如果遇到是左括号就入栈到堆栈中,如果遇到的是右括号,则从堆栈中取出栈顶的第一个左括号,比对一下这个左括号和当前遇到的右括号是否匹配,如果不匹配这认为这整个字符串无效。如果能匹配,则OK,删除这个左括号和右括号,继续往后走,继续遍历字符串中剩下的字符,只要遇到左括号就入栈,只要遇到右括号就与将栈顶的左括号出栈与之比较。一直走到字符串结束,再来检查堆栈中是否还有元素,如果还有元素,则这个字符串同样无效,如果堆栈为空,则字符串有效。	就以这个思路实现一个初版代码:	
class Solution {	public boolean isValid(String s) {	Stack<Character> satck = new Stack<Character>();	for(int i=0; i<s.length();i++){	char c = s.charAt(i);	if(c=='(' || c=='{' || c=='['){	satck.push(c);	}else{	if(satck.isEmpty()) return false;	char temp = satck.pop();	if( (temp=='('&&c==')') || (temp=='{'&&c=='}')  || (temp=='['&&c==']') ){	continue;	}else{	return false;	}	}	}	return satck.isEmpty();	}	
}	
这个代码的时间复杂度o(n),空间复杂度o(n)搞定。	但是想了想,好像代码不是很优雅,写了一个优化版,提前将左右括号放入到MAP中,这个方法的时间和空间复杂度跟上面的一样。	
class Solution {	public boolean isValid(String s) {	Stack<Character> stack = new Stack<Character>();	HashMap<Character,Character> map = new HashMap<Character,Character>();	map.put('(', ')');	map.put('{','}' );	map.put('[', ']');	for(int i=0;i<s.length();i++){	char c = s.charAt(i);	if(map.containsKey(c)){	stack.push(c);	}else{	if(stack.isEmpty()) return false;	char temp = stack.pop();	if(map.get(temp)!=c) return false;	}	} 	return stack.isEmpty();	}	
}	继续思考有没有更简洁的方法,竟然在leetcode上找到了一个:	
但是这个方法并没有用到堆栈哦,它的思路是不断的遍历这个字符串,将字符串中的(){}[]全部调换成空字符串,如果最后全部替换完成了,并且字符串为空了,就说明字符串是有效的,否者就是无效的字符串。	
class Solution {	public boolean isValid(String s) {	int length = s.length();	do{	length = s.length();	s = s.replaceAll("\\(\\)","").replaceAll("\\{\\}","").replaceAll("\\[\\]","");	}while(s.length()!=length);	return s.length()==0;	}	
}	


以上,就是对数据结构中「 堆栈 」的一些思考。

 640?wx_fmt=png

福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

640?wx_fmt=jpeg

推荐阅读:

  • 记一道字节跳动的算法面试题

  • AI ProCon圆满落幕,五大技术专场精彩瞬间不容错过

  • 开源sk-dist,超参数调优仅需3.4秒,sk-learn训练速度提升100倍

  • 拯救 CPU!

  • 马化腾、张一鸣……大佬真实朋友圈,竟然藏着这些秘密

  • 揭秘沃尔玛、腾讯、京东、浙商银行的供应链管理方案

真香,朕在看了!

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

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

相关文章

Centos/Red Hat7.9 源码和在线yum 安装 vsftpd

文章目录一、版本简述1. 环境介绍2. 常用命令二、源码下载2.1. 官网链接2.2. 下载方式2.3. 检查2.4. 源码安装2.5. 异常处理2.6. 检查是否安装成功一、版本简述 1. 环境介绍 软件系统版本Red Hat Enterprise Linux Server7.9 (Maipo)CentOS Linux release 7.9(Core)jdk1.8.0_…

阿里云黄海宇:窄带高清2.0——让直播更惊艳的魔术

摘要&#xff1a; 2018年4月11-12日&#xff0c;2018亚太CDN峰会在北京隆重召开&#xff0c;大会由亚太CDN领袖论坛、电视云论坛、短视频论坛、视频云论坛、新技术论坛、运营商论坛、国际云论坛等7大部分组成。在视频云论坛上&#xff0c;阿里云视频云高级算法专家黄海宇作了题…

vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot ()错误的解决方法

原vsftpd服务器的系统从centos6.8升级到centos7.2。vsftpd使用yum方式安装&#xff0c;用户采用系统用户登录。由于系统升级到centos7&#xff0c;yum安装的vsftpd版本改变。因此按centos6的设置&#xff0c;登录时报错。配置文件未修改&#xff0c;主要是修改了ftp的主目录权限…

学Python后到底能干什么?网友:我太难了

感觉全世界营销文都在推Python&#xff0c;但是找不到工作的话&#xff0c;又有哪个机构会站出来给我推荐工作&#xff1f;笔者冷静分析多方数据&#xff0c;想跟大家说&#xff1a;关于超越老牌霸主Java&#xff0c;过去几年间Python一直都被寄予厚望。但是事实是虽然上升趋势…

基于PCDN技术的无延时直播方案

摘要&#xff1a; 2018亚太CDN峰会在北京隆重召开&#xff0c;在4月12日上午的运营商论坛中&#xff0c;阿里云边缘计算团队高级技术专家张士波进行了《基于PCDN技术的无延时直播方案》的主题演讲。本文为演讲内容。当大家谈到直播&#xff0c;一般很惊讶于直播近几年来发展的规…

VSFTPD Centos 7.6 _配置篇

接上一篇&#xff1a;企业内部&#xff09;Centos7.6 源码安装vsftpd https://gblfy.blog.csdn.net/article/details/103491052 文章目录一、常用命令二、 需求案例三、思路分析3.1. 创建用户3.2. 配置3.3. 限制用户活动范围四、coding实战4.1. 家目录调整4.2. 为test设置密码4…

阿里云弹性计算负责人蒋林泉:亿级场景驱动的技术自研之路

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 刘丹出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;近年来随着云计算如火如荼的发展&#xff0c;上云已经成为当前企业的必经路径。但在国内良莠不齐的云服务市场下&#xff0c;云服务器的选型评估长期困…

阿里云容器Kubernetes监控(一) - 资源监控

摘要&#xff1a; 容器通过集装箱式的编译、打包、部署&#xff0c;大大提高了应用的迭代速度。对于架构师而言&#xff0c;容器带来的是分钟级的部署、秒级的伸缩与恢复、一个量级的迭代速度提升、50%左右的基础成本节省。简介容器通过集装箱式的编译、打包、部署&#xff0c…

Kubernetes之路 3 - 解决服务依赖

摘要&#xff1a; 在容器服务的客户群中&#xff0c;一个经常被问起的问题就是如何处理服务间依赖。本文介绍了常见的解决方法来实现服务的依赖检查&#xff0c;还进一步用示例展示了如何利用init container&#xff0c; liveness/readiness探针等技术实现服务健康检查&#xf…

Logtail从入门到精通(一):日志采集杂谈

摘要&#xff1a; 目前logtail已承载阿里云全站、所有云产品服务、全球各Region部署、阿里巴巴集团&#xff08;淘宝、天猫、菜鸟等&#xff09;上重要服务的数据采集。每天采集接近百万服务器上数PB的实时数据&#xff0c;对接数千个应用与消费者。什么是日志提到日志&#xf…

互联网大佬马老师于昨日教师节正式卸任,让位现任CEO张勇;华为发布新一代CloudLink视讯解决方案,普惠4K+AI;联通……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go OPPO Reno2正式发布&#xf…

Logtail从入门到精通(二):开启日志采集之旅

摘要&#xff1a; 为了更好的了解日志采集&#xff0c;这里我们首先对日志采集中遇到的基本概念进行简要的介绍。Logtail相关概念为了更好的了解日志采集&#xff0c;这里我们首先对日志采集中遇到的基本概念进行简要的介绍。概念介绍项目&#xff1a; 项目&#xff08;Project…

关于SDN的未来,Linux基金会专访阿里云网络大神

摘要&#xff1a; 近日&#xff0c;大家熟知的国际开源组织Linux基金会与阿里云进行了一次访谈。专访了阿里云网络团队掌门人江鹤。江鹤执掌阿里云网络产品线&#xff0c;并负责阿里集团网络虚拟化产品的研发管理工作。在软件定义网络&#xff08;SDN&#xff09;和网络功能虚拟…

5G 共建共享,究竟会带来什么影响?

戳蓝字“CSDN云计算”关注我们哦&#xff01;共建共享真的来了。根据9月9日中国联通发布的公告&#xff0c;中国联通和中国电信正式签署了《5G网络共建共享框架合作协议书》&#xff0c;将在全国范围内合作共建一张5G接入网络。图片来源网络小枣君认为&#xff0c;这一事件对于…

object转float_人工智能-Object Detection API 模型转tflite并验证

最近在用TensorFlow Object Detection API训练目标检测模型&#xff0c;训练好的pb模型大小17.6M&#xff0c;用pb预测效果不错&#xff0c;于是想着如何在手机端运行&#xff0c;查看官网关于tflite的转换&#xff0c;网址&#xff1a;https://github.com/tensorflow/models/b…

Multi Task Learning在工业界如何更胜一筹

摘要&#xff1a; 本文主要介绍多任务学习和单任务学习的对比优势以及在工业界的一些使用。如何从单任务学习转变为多任务学习&#xff1f;怎样使AUC和预估的准确率达到最佳&#xff1f;如何对实时性要求较高的在线应用更加友好&#xff1f;本文将以淘宝实例为大家进行分享多任…

rsync一行代码实现远程文件同步之修改默认22端口

由于需求需要把应用服务器上的日志文件同步到文件服务器上&#xff0c;但是又不能用22端口 文章目录一、应用服务器脚本修改如下二、文件服务器操作三、执行脚本测试四、应用服务器生成ssh key五、文件服务器添加key5.1. 打开.ssh文件夹目录&#xff1a;5.2. 创建authorized_ke…

上云难?TA霸气回应:不要你觉得,一键上云 so easy!

戳蓝字“CSDN云计算”关注我们哦&#xff01;图片来源网络2019年阿里提出的“All in Cloud”战略以及《全球云计算 IT 基础设施市场预测报告》的数据结果&#xff0c;都在表明企业上云已成不可逆之势&#xff1b;但上云事故接二连三发生似乎又在宣示企业上云之路道阻且长&#…

基于阿里云HiTSDB搭建工业物联网平台实践

摘要&#xff1a; 基于阿里云全面的物联网、云计算与大数据技术搭建云端的企业能源管理物联网平台实现能耗数据采集、统计分析、平衡调度、节能优化等全面的能源管控协同平台。是企业生产运行保障的利器&#xff0c;也是大量企业实现云上管理的实践案例。背景工业企业的能耗占了…

阿里巴巴开源的通用缓存访问框架JetCache介绍

摘要&#xff1a; JetCache是由阿里巴巴开源的通用缓存访问框架&#xff0c;如果你对Spring Cache很熟悉的话&#xff0c;请一定花一点时间了解一下JetCache&#xff0c;它更好用。JetCache可以做类似Spring Cache的注解式缓存&#xff0c;支持TTL、多级缓存、分布式自动刷新&a…