什么是栈

栈是一种线性的 后进先出 的数据结构,其规定了数据只能在栈顶进行操作,要么从栈顶压入数据,要么从栈顶弹出数据

生活中就有类似栈的例子,比如吃完饭,将盘子一个一个摞起来,然后洗盘子的时候,从摞起来的盘子中的顶部拿一个来洗,这就是类似栈的操作,先放的盘子在底部,后放的盘子在顶部,后放的盘子先被洗( 弹出 )

栈的操作的时间复杂度都是 O(1),因为其只涉及在栈顶的压入或者弹出操作,不涉及别的额外的操作

栈的应用

在函数调用中的应用

内存中 '栈' 这块内存地址被用来 存储函数调用时的临时变量,每执行一个函数,就会将其临时变量装成一个 栈帧'栈',在其执行完毕之后,再将其所对应的 栈帧 出栈

function sum(a, b) {
  var sum = a + b;
  return sum;
}

var a = 1;
var b = 2;
sum(a, b);
栈帧

在表达式求值中的应用

对于求值表达式,类似 3+2*1-5 这种,我们也可以通过栈来计算其结果
其步骤如下:

  1. 创建两个栈用来存放 运算符操作数
  2. 循环目标字符串
  3. 当前运算符如果比栈顶的运算符优先级要高,则入栈,否则,弹出栈顶运算符,进行运算,结果入操作数栈

在括号匹配中的应用

栈可以用来判断字符串中的括号是否对应,例如 '()'、'[]'、'{}'、')(',最后一个就是对应不上的

  1. 遇到左括号,入栈
  2. 遇到与栈顶左括号匹配的右括号,出栈
  3. 结束时,栈非空,则表示不匹配

实现浏览器前进、后退功能

使用两个栈来保存浏览历史和后退操作

被点击的 url 入栈1,点击后退,栈1顶部的 url 出栈入栈2,点击前进,栈2顶部的 url 出栈入栈1,当栈1有新的 url 入栈时,清空栈2,相当于 栈2保存的是后退的操作记录

浏览器前进后退

思考

  1. 内存中的栈和上面所说的栈是一样的吗?

内存中的堆栈 和 数据结构的堆栈是不一样的,内存中的堆栈是 真实的物理地址区域,数据结构的堆栈是抽象出来的数据存储结构,在内存物理地址上做了和逻辑数据结构一样的操作( 出栈,入栈... ),就将其类比称为对应的数据结构

  1. 为什么函数调用要用栈这种数据结构,用其它数据结构不行吗?

其实用其它数据结构也可以,不过在函数嵌套调用时,栈最符合这种 后进先出 的逻辑,所以用栈是最好的选择。从调用函数进入被调用函数,对于数据只是作用域的变化,使用栈的话,被调用函数执行完毕之后出栈,正好回到调用函数的作用域

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 不的不承认,很淡定无所谓的我现在要炸裂了,我遇到了人生中我认为的第一个挫折------会计从业过了两次都没过去。此...
    两个月亮阅读 1,432评论 0 1
  • 对待爱情我们要做到: 敲不开的心门,就洒脱转身;留不住的缘分,是情缘已尽;别困扰了别人,又丢了自尊,伤了自心。 宁...
    天空不懂向日葵的伤阅读 1,720评论 0 0
  • 自从我自己收发手机之后,一直都是把30部旧手机锁在主任办公室的柜子里。有一天,主人办公室的门锁了,我只好把这...
    shinezs阅读 1,450评论 0 0
  • 昨天下午在群里互动,看到毛毛姐、广军姐说自己的不足和不够,撩起了我的愤怒,她们明明很好了还要伪装自己。我向内看自己...
    长青竹ing阅读 1,099评论 0 2

友情链接更多精彩内容