什么是栈?

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

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

栈对比数组和链表

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

栈的两种实现方式

顺序栈:用数组实现的

链式栈:用链表实现的

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

当插入数据,顺序栈没有空间的时候,就会重新请求一块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

原文地址:https://www.cnblogs.com/zx125/p/11692850.html