您现在的位置是:热点 >>正文
聊一聊算法之旅:栈
热点26369人已围观
简介...
本质栈是一种特殊的数据结构,它特殊在它的结构,与数组、链表不同的是,它的数据出入规则是:先进后出,后进先出。
由于它这种特殊的特性,它一般用于指定的场景之下,例如:浏览器的前进与回退效果。
浏览器的特性是:我们可以向前访问我们之前访问的网站,也可以向后访问后面的网站。
浏览器的这种特性,完美匹配了栈的结构。
我们只需使用两个栈,分别代表浏览器的向前访问与向后访问。
当某个数据集合聊一只涉及在一端插入和删除数据,并且满足先进后出,后进先出的特性,这时我们应该首先想到的是栈,看它是否能够更好的实现我们所需的场景。
实现方式栈的实现方式有两种,一种是基于数组的实现方式,称为顺序栈;另一种是基于链表的实现方式,称为链式栈。
这两种实现方式区别不是很多,实现之后栈的出入时间复杂度都是O(1)。
不同的是基于数组实现的栈消耗的内存更少,因为它不需要额外保存指向的指针。
但基于数聊算组的另外一额外需要做的是,如果需要实现不定大小的栈,它需要实现动态扩容,这是所有基于数组实现的一个必修课。
下面我们来实现一个基于数组的顺序栈,为了减少复杂度,不考虑扩容的情况。
// 基于数组实现的顺序栈class ArrayStack(private val n: Int) { private val items = arrayOfNulls(n) // 栈数组 private var coun法之t = 0 // 栈的当前大小 // 入栈 fun push(item: String): Boolean { // 数组空间不够了,直接返回false,入栈失败 if (count == n) return false // 将item放到下标为count的位置,并且count加一 items[count] = item ++count return true } // 出栈 fun pop(): String? {旅: // 栈为空,则直接返回null if (count == 0) return null // 返回下标为count-1的数组元素,并且栈中元素个数count减一 val tmp = items[count - 1] --count return tmp }}
基于上面的实现,我们能够很容易得出栈的出入时间复杂度为O(1)。
另一方面,由于没有额外的空间申请,所以栈的空间复杂度为O(1)。
扩容上面我们实现的是一个固聊一定的顺序栈,也就是说初始化的时候已经指定了栈的大小,当栈满了的时候,无法进行向栈中添加数据。当然基于链表的链式栈没有这种限制。
为了解决顺序栈的这种限制,我们需要对数据进行扩容操作,这在数组那一节也有提及过。
所以,如果要实现一个支持扩容的栈,我们只需底层依赖一个基于扩容的数组即可。
具体的扩容示意图如下:
具体代码实现可以查看数据的扩容。
下面我们再来分析一下基于数组扩容的栈的时间复杂度聊算。
首先未达到栈的大小时,这一阶段与固定的顺序栈一样,出入的时间复杂度都为O(1)。
当数据为K时且达到扩容的临界点时,需要将数组的大小扩大到原来的两倍,并将之前的数据拷贝的新的数组中;这一阶段消耗的时间复杂度为O(K)。
当扩容结束之后继续出入栈,此时的时间复杂度又为O(1)。
当再一次达到2k时又需要再次扩容,拷贝数据到新数组中,此时消耗的时间复杂度为O(2k)。
反复重复以上步骤。
这法之就是支持扩容的顺序栈的时间复杂度的变化。也就是说最好情况的时间复杂度为O(1);最坏的时间复杂度为O(n)。那么平均时间复杂度呢?
还记得在算法之旅:复杂度分析中提到的均摊时间复杂度吗?
下面我们就利用均摊时间复杂度来分析它的平均时间复杂度。其实看一张图就能够明白均摊时间复杂度的算法。
每次我们都将扩容的所消耗的时间都分摊到之后的入栈中。在分摊之前入栈需要一个push的时间;分摊之后入旅:栈在push的时间上再加上一个数据move的时间。push与move的时间复杂度都为O(1)。
所以均摊之后栈的整个时间复杂度就是O(1),即栈的平均复杂度为O(1)。
栈的应用现在我们已经对栈有了一个全面的了解,为了完全巩固栈这种数据结构,我们剩下的就是练习以达到熟悉程度。
例如:实现一个基本的计算器来计算一个简单的字符串表达式的值, 字符串表达式可以包含左括号(,右括号),加聊一号+,减号-,非负整数和空格。
基于表达式的运算,非常符合栈这种结构,我们可以使用栈来实现的。实现思路如下:
通过设定一个符号位将所有的运算转化成加法
遇到数字都带上之前的符号位,再与之前的结果做加法运算
遇到'('将之前的符号位与结果保留到栈中,然后再重复1 2步骤计算括号里面的值
遇到')'取出之前保留的符号位与结果,与当前结果做加法运算
/** * O(n) */fun calculate(s:聊算 String): Int { val numberStack = Stack() var sign = 1 // 符号位 var result = 0 var index = 0 while (index < s.length) { when (s[index]) { '+' -> { sign = 1 } '-' -> { sign = -1 } '(' -> { // 将当前结果加法之入栈中 numberStack.push(result) result = 0 // 将当前符号位加入栈中 numberStack.push(sign) sign = 1 } ')' -> { // 取出之前保留的符号位与结果,与当前结果做加法运算 result = numberStack.pop() * result + numberStack.pop() } ' ' -> { } else -&旅:gt; { // 计算出当前的数值,可以能为多位数 var cur = s[index] - '0' while (index + 1 < s.length && s[index + 1].isDigit()) { cur = cur * 10 + (s[++index] - '0') } // 遇到数字带上之前的符号位,再与之前的结果做加法运算 result += cur * sign } } index++ }聊一 return result}
还有一些关于栈的经典练习,如果能够掌握这些,那么有关栈的算法就基本没什么问题了
比较含退格的字符串
棒球比赛
下一个更大元素
有效的括号
我将源码放在Github上了,如有需要的可以自行查看。
本文转载自微信公众号「 Android补给站
Tags:
相关文章
加快海外布局 阿里云将投入70亿元建国际生态 增设6大海外服务中心
热点9月22日消息,阿里云在泰国举办的国际云峰会上宣布将继续加快海外市场布局,未来三年投入70亿元建设国际本地化生态,并在海外增设6个服务中心,分别位于波尔图、墨西哥城、吉隆坡、迪拜等地。 阿里云智能总裁...
【热点】
阅读更多标签: TCL电子 MiniLED TV 量子点TV 光伏业务
热点云梦级3月27日云梦级消息,3月27日晚间,TCL电子(01070.HK)公布最新财报显示,2025年收入突破千亿,达1145.83亿港元,同比增长15.4%;毛利达179亿港元,同比增长15.1%;...
【热点】
阅读更多Firefox142上线:低调更新背后,本地AI扩展已悄然启航
热点Mozilla 今日正式推送 Firefox142.0版本至稳定发布通道,预计将于周二全面面向用户上线。尽管此次更新未带来大规模功能革新,但其在底层支持与开发者工具方面的调整,或将引发关于浏览器扩展与...
【热点】
阅读更多
热门文章
最新文章
友情链接
- 标签: 康师傅
- https://5gaa.org/?token=6e2l7hjt2i26gzgctgwdrv7v0j6nxorq&s=小旋风万能蜘蛛池【tg:seogoogle987】nf7
- https://www.udc.co.uk/index.php?route=product/search&sort=p.price&order=DESC&tag=小旋风万能蜘蛛池【tg:seogoogle987】,b4D
- https://www.teamlab.art/it/?submit=小旋风万能蜘蛛池【tg:seogoogle987】,XVJ
- https://www.varian.com/en-au/search?cat=113&search=小旋风万能蜘蛛池【tg:seogoogle987】,ihX
- https://www.rockngem.com/?action=CHECK&s=小旋风万能蜘蛛池【tg:seogoogle987】,zrI
- https://www.mingwai.edu.hk/?langzh-hant&s=小旋风万能蜘蛛池【tg:seogoogle987】,8Jq
- https://www.remit.co.jp/zh/?s=小旋风万能蜘蛛池【tg:seogoogle987】,Spf
- https://www.teamlab.art/pt/?submit=小旋风万能蜘蛛池【tg:seogoogle987】,5B5
- https://www.tycoonstory.com/?s=小旋风万能蜘蛛池【tg:seogoogle987】,tdi
- https://www.kores.com/?s=小旋风万能蜘蛛池【tg:seogoogle987】,N6u
- https://www.tiktok.com/tag/小旋风万能蜘蛛池【tg:seogoogle987】,jhV
- https://www.rea.govt.nz/search?searchterm=小旋风万能蜘蛛池【tg:seogoogle987】,ilv
- https://www.otakuninjahero.com/en/search/小旋风万能蜘蛛池【tg:seogoogle987】,Gik
- https://www.teamlab.art/fr/?submit=小旋风万能蜘蛛池【tg:seogoogle987】,p5a
- https://yscc1986.net/search/小旋风万能蜘蛛池【tg:seogoogle987】DkT
- https://www.unclefossil.com/search/小旋风万能蜘蛛池【tg:seogoogle987】,GcM
- https://www.teamlab.art/zh-hans/?submit=小旋风万能蜘蛛池【tg:seogoogle987】,18z
- https://www.seforall.org/search?keywords=小旋风万能蜘蛛池【tg:seogoogle987】,k2e
- https://www.wellbees.com/index.php/catalogsearch/result/index/?q=小旋风万能蜘蛛池【tg:seogoogle987】,vpq
- https://xehay.vn/tim-kiem/=小旋风万能蜘蛛池【tg:seogoogle987】,Heb
- https://www.rotherham.gov.uk/site-search/results/?q=小旋风万能蜘蛛池【tg:seogoogle987】,oHs
- https://www.openspaceinstitute.org/search?q=小旋风万能蜘蛛池【tg:seogoogle987】,lwC
- https://www.lifesciencesweden.se/search?q=小旋风万能蜘蛛池【tg:seogoogle987】,WNZ
- https://www.hanbat.ac.kr/search/front/Search.jsp?qt=小旋风万能蜘蛛池【tg:seogoogle987】w0C
- https://www.posten-portal.de/search?query=小旋风万能蜘蛛池【tg:seogoogle987】,JYn
- https://www.sic-info.org/en/?s=小旋风万能蜘蛛池【tg:seogoogle987】,08H
- https://www.sogou.com/web?query=小旋风万能蜘蛛池【tg:seogoogle987】,2mE
- https://www.kaskus.co.id/search?q=小旋风万能蜘蛛池【tg:seogoogle987】,7hh
- https://www.roberthalf.com/us/en/jobs/all/小旋风万能蜘蛛池【tg:seogoogle987】1HF
- https://www.lenovo.com/gb/en/search?action=SEARCH&text=小旋风万能蜘蛛池【tg:seogoogle987】,h0j
- https://www.paxnet.co.kr/search/jongmok?kwd=小旋风万能蜘蛛池【tg:seogoogle987】8Zv
- https://www.pearson.com/en-us/search.html?aq=小旋风万能蜘蛛池【tg:seogoogle987】,iIR
- https://www.woorden.org/spreekwoord.php?woord=小旋风万能蜘蛛池【tg:seogoogle987】,Bx9
- https://www.tahiti-infos.com/search/小旋风万能蜘蛛池【tg:seogoogle987】,gmp
- https://www.shacknews.com/editorial-search?q=小旋风万能蜘蛛池【tg:seogoogle987】,gOV
- https://www.sportbiketracktime.com/index.php?route=product/search&tag=小旋风万能蜘蛛池【tg:seogoogle987】,43K
- https://www.swanagerailway.co.uk/search?q=小旋风万能蜘蛛池【tg:seogoogle987】,ATf
- https://search.danawa.com/dsearch.php?query=小旋风万能蜘蛛池【tg:seogoogle987】Drs
- https://www.quarterjacksurgery.co.uk/?AT=3rBy&s=小旋风万能蜘蛛池【tg:seogoogle987】,3e6
- https://www.nyif.com/catalogsearch/result/index/?f=sarbanesoxleyU&index=me_cms_pe&lit=20&mode=list&p=1&q=小旋风万能蜘蛛池【tg:seogoogle987】,X6R
- https://www.shopping.com/search.html?keyword=小旋风万能蜘蛛池【tg:seogoogle987】,xw2
- https://www.nissin.com/jp/search/?cat=105&q=小旋风万能蜘蛛池【tg:seogoogle987】,8Fc
- https://www.londontheatredirect.com/search/小旋风万能蜘蛛池【tg:seogoogle987】,PuF
- https://www.pixiv.net/tags/小旋风万能蜘蛛池【tg:seogoogle987】,yMP
- https://www.teacherspayteachers.com/Browse/Search:小旋风万能蜘蛛池【tg:seogoogle987】,Yba
- https://jihoon471.cafe24.com/product/search.html?banner_action=&keyword=小旋风万能蜘蛛池【tg:seogoogle987】RyL
- https://www.reallywildbirdfood.co.uk/store/search?q=小旋风万能蜘蛛池【tg:seogoogle987】,XDO
- https://www.tailoy.com.pe/catalogsearch/result/?q=小旋风万能蜘蛛池【tg:seogoogle987】,R4P
- https://www.youtube.com/results?search_query=小旋风万能蜘蛛池【tg:seogoogle987】,UAJ
- https://www.stormberg.com/no/search?q=小旋风万能蜘蛛池【tg:seogoogle987】,p7N