什么是栈?

栈是一个“后进先出,先进后出”的线性表。如果某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,我们就应该首选“栈”这种数据结构。

 

栈的类型

栈并不是一个底层的数据结构,它是一个抽象的数据结构。根据构成栈的数据结构可以把栈分为顺序栈(数组构成)和链式栈(链表)。

初始化栈的时候必须指定栈的大小。以此我们可以得出栈的空间复杂度是O(1),根据定义,可以得出时间复杂度为O(1)。

所以这个指定栈的大小肯定会带来一个问题,就是不够用了咋办。

这边介绍下支持动态扩容的顺序栈。正如之前所说,顺序栈是数组构成的。所以动态扩容顺序栈的方法和动态扩容数组是一样的。先copy,再操作。根据栈的特性可以得出,动态扩容顺序栈的空间复杂度还是O(1),均摊复杂度也是O(1)。

 

栈的应用

说一个栈最常见也最经典的应用。函数调用栈

可以根据越深的函数处理完之后立马释放的这个角度来解释。

 

栈的使用有一个小技巧,就是同时使用多个栈。

浏览器的页面为例,有a,b,c页面,按照时间:

a -> b -> c,a页面到b页面到c页面

a <- b <- c,c页面返回到b到a

a -> b -> d,a页面前进到b后到d页面。再返回的话已经找不到c页面了。

 

这个应用可能不是很生动,那就以算术表达式为例。

3+5*8-6这个表达式

新建两个栈,一个是保存操作数的栈,一个是保存运算符的栈。

按顺序来回压栈,当到-的时候,发现里面已经有个*了,所以先算乘法,算完之后再把操作数的栈更新成计算的结果再继续压栈。

 

括号匹配等。

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值