什么是栈?
栈是一个“后进先出,先进后出”的线性表。如果某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,我们就应该首选“栈”这种数据结构。
栈的类型
栈并不是一个底层的数据结构,它是一个抽象的数据结构。根据构成栈的数据结构可以把栈分为顺序栈(数组构成)和链式栈(链表)。
在初始化栈的时候必须指定栈的大小。以此我们可以得出栈的空间复杂度是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这个表达式
新建两个栈,一个是保存操作数的栈,一个是保存运算符的栈。
按顺序来回压栈,当到-的时候,发现里面已经有个*了,所以先算乘法,算完之后再把操作数的栈更新成计算的结果再继续压栈。
括号匹配等。