丶灬走出姿态 提交于 2019-12-01 16:23:39

什么是栈?

栈就类似放盘子,盘子一块一块叠起来,如果我们拿盘子的话只能拿到刚刚放下去的盘子。

总结来说就是,先进者后出,后进者先出,的一种数据结构

栈对比数组和链表

我们从栈的特点上,我们知道它的操作对比数组和链表,受到了很强的限制,增加和修改都只有单一的方式,没有数组和链表那样的灵活性。

栈的两种实现方式

顺序栈:用数组实现的

链式栈:用链表实现的

可动态扩容的顺序栈-复杂度分析

当插入数据,顺序栈没有空间的时候,就会重新请求一块2背的内存,然后进行原来的数据的搬运,然后在插入数据。

当顺序栈的内存够用

出栈的时间复杂度都为O(1)

但是入栈的话要考虑到内存满的时候,这个时候就满足了均摊的时间复杂度了,内存还有的话,时间复杂度一直为O(1),只有当内存满了的时候时间复杂度为O(n),但是均摊下来,时间复杂度就是O(1)

一般均摊时间复杂度=最好情况时间复杂度

栈的实际应用

栈在函数调用的应用-函数调用栈

我们知道真正执行代码的是我们的线程,每个线程都有一块独立的内存空间,这个内存就是栈这种结构,用来存储函数调用的时候的临时变量。每进入一个函数,就会将临时变量作为一个栈帧入栈,当被调用函数函数执行完成,返回之后,将这个函数的对应的栈帧出栈

int main(){     int a = 1;     int ret = 0;     int res = 0;     ret = add(3,5);     res = a + ret;     return 0; }  int add(int a,int y){     int sum = 0;     sum = x + y;     return sum; }

栈图

栈在数学计算的应用

通过两个栈实现,一个栈保存数据,一个栈保存运算符

从左到右识别,遇到数字就直接入栈,遇到运算符,如果栈为空就直接入栈,如果不为空,就和栈顶运算符比较优先级。

如果栈顶的优先级高,就压入栈;如果低,就取出两个数字进行计算,然后把数据继续压入,继续判断

括号匹配

{}()[}]例如这种

直接从左向右扫描,如果出现了一个括号就把这个括号入栈,继续从左向右扫描,如果发现了匹配的值就,吧之前的出栈,如果没有找到就是不匹配括号的。

浏览器的前进和后退

浏览器的前进和后退就是利用了两个栈,x是浏览的记录,当后退的时候,x出栈,y入栈,当访问新的界面会先清空y

极客时间版权所有: https://time.geekbang.org/column/article/41222

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!