zoukankan      html  css  js  c++  java
  • 什么是栈?

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

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

    栈对比数组和链表

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

    栈的两种实现方式

    顺序栈:用数组实现的

    链式栈:用链表实现的

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

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

  • 相关阅读:
    MongoDB的固定集合
    MongoDB的导入导出
    MongoDB的数据备份与恢复
    MongoDB的索引
    MongoDB简单CRUD场景
    MongoDB入门
    NOSQL概念入门
    Java静态代理和动态代理
    a=a+1背后的内存模型和CPU高速缓存
    SpringCloud的学习记录(6)
  • 原文地址:https://www.cnblogs.com/zx125/p/11692850.html
Copyright © 2011-2022 走看看