• 数据结构之栈


    文章来源:http://blog.seclibs.com/数据结构之栈/

    前面说完了数组和列表两个常用的数据结构,虽然它们的实现代码还很粗糙,但是不妨碍自己对数据结构的深入理解,接下来就说一说栈(stack)

    栈,可以用一个很常见的事物来说明,比如我们放了一摞盘子,如果我们想取走下面的某一个盘子,就必须先将上面的盘子挨个移走才可以,跟小时候玩的汉诺塔益智游戏是一样的结构, 也就是后放上去的先拿出来,先放进去的后拿出来。

    从栈的特性上来看,栈是一种受限制的线性表,它只允许在一端进行插入和删除操作,在功能实现上完全可以用数组和链表来代替,但是栈也有它自己的好处,因为只允许在一端进行插入和删除,它所暴露的操作接口就比数组和链表少很多,也就更加安全,牺牲了灵活性而增加了安全性。

    对于栈来说,需要进行的操作只有两种,入栈和出栈,即在栈顶进行插入和删除操作,它们所涉及到的数据变化是个别数据的操作,而且入栈和出栈也就只有对栈顶元素操作时的几个临时变量,所以它的时间复杂度和空间复杂度均为O(1)。

    在代码实现上,它既可以使用数组来实现,也可以使用链表来实现,用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。

    这里还会涉及到的一个方法就是如何对栈进行动态扩容,对于链式栈来说,虽然不存在受固定大小的限制,但是大量的next指针,对内存的消耗也是比较巨大的。

    动态扩容就是在空间不够时,重新创建一块比当前内存空间大的空间,然后将所有的数据都拷贝过去,这样就实现了动态扩容,一般新创建的内存空间的大小都是之前空间大小的0.5倍或1倍。

    大致的过程如下图所示

    在对于栈的理解当中,还要注意一点,内存中的栈与数据结构中的栈是完全不同的两个概念,需要特别注意一下

    引用自极客时间- 阿杜S考特

    内存中的堆栈和数据结构堆栈不是一个概念,可以说内存中的堆栈是真实存在的物理区,数据结构中的堆栈是抽象的数据存储结构。
    内存空间在逻辑上分为三部分:代码区、静态数据区和动态数据区,动态数据区又分为栈区和堆区。
    代码区:存储方法体的二进制代码。高级调度(作业调度)、中级调度(内存调度)、低级调度(进程调度)控制代码区执行代码的切换。
    静态数据区:存储全局变量、静态变量、常量,常量包括final修饰的常量和String常量。系统自动分配和回收。
    栈区:存储运行方法的形参、局部变量、返回值。由系统自动分配和回收。
    堆区:new一个对象的引用或地址存储在栈区,指向该对象存储在堆区中的真实数据。

    对于栈的说明就这么多,接下来就是尝试对它进行代码实现。


    参考文档:

    极客时间-数据结构与算法之美

    文章首发公众号和个人博客

    公众号无心的梦呓(wuxinmengyi)

    个人博客:http://blog.seclibs.com/

    安全库:http://www.seclibs.com/

  • 相关阅读:
    C++栈(stack)、队列(queue)、链表(list)的常用函数
    C++中cin>>a原理
    C++中vector和堆的常用使用方法&例题:数据流中的中位数
    使用centos8搭建僵尸毁灭工程(PZ)服务器
    【从C#走进Python】四、装饰器
    【从C#走进Python】三、变量声明
    【从C#走进Python】二、迭代器
    【从C#走进Python】一、上下文管理器
    【C#基础】拥抱Lambda(2):表达式树与LINQ
    【机器学习笔记】Python机器学习基本语法
  • 原文地址:https://www.cnblogs.com/wuxinmengyi/p/12243754.html
Copyright © 2020-2023  润新知