数据结构_堆栈

----关于堆栈的笔记     

        堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或者删除的线性表.允许插入或删除操作的一端为栈顶,另一端称为栈底.对堆栈的插入和删除操作称为入栈和出栈.有一组CPU指令可以实现对进程的内存实现堆栈访问.其中,POP指令实现出栈操作,PUSH指令实现入栈操作.CPU的ESP寄存器存放当前线程的栈顶指针,EBP寄存器中保存当前线程的栈底指针.CPU的EIP寄存器存放下一个CPU指令存放的内存地址.当CPU执行完当前的指令后,从EIP寄存器中读取下一个指令的内存地址,然后继续执行.

        我们都知道,高级语言都能通过变量名访问内存中的数据.那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?

        首先看一下C语言的变量是如何在内存分布的.C语言有全局变量,本地变量,静态变量和寄存器变量.每种变量都有不同的分配方式.看下面:

 

        输出的结果就是变量的内存地址.可以发现这些变量在内存中是连续分布的,但是本地变量和全局变量分配的内存地址差了很远,而全局变量和静态变量分配的内存是连续的.这是因为本地变量和全局,静态变量是分配在不同类型的内存区域中的结果.对于一个进程的内存空间而言,可以在逻辑上分成3个部分:代码区,静态数据区和动态数据区.动态数据区一般就是"堆栈"."栈"和"堆"是两种不同的动态数据区.栈是一种线性结构,堆是一种链式结构.进程的每个线程都有私有的栈,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰的

        一个堆栈可以通过基地址和栈顶地址来描述.全局变量和静态变量分配在静态数据区.本地变量分配在动态数据区,即堆栈中.程序通过堆栈的基地址和偏移量来访问本地变量.如图:

        堆栈是一个先进后出的数据结构,栈顶地址总是小于等于栈的基地址.我们可以先了解一下函数调用的过程,以便对堆栈在程序中的作用有更深入的了解.不同的语言有不同的函数调用规定,这些因素有参数的压入规则和堆栈的平衡.Windows API 的调用规则和ANSI C的调用规则是不一样的.前者由被调用函数调整堆栈,后者由调用者调整堆栈.两者通过”_stdcall”和”_cdecl”前缀区分.看下面代码:

 

        下图就是函数调用过程中堆栈的样子.首先,3个参数从右到左的次序压入堆栈,先压”param3”,再压2,再压1.然后压入函数的返回地址(RET),接着跳转到函数地址接着执行.第三步,将栈顶(ESP)减去一个数,为本地变量分配内存空间,上例中是减去12字节(ESP = ESP - 3*4,每个int变量占4个字节).接着就初始化本地变量的内存空间.由于”_stdcall”调用由被调函数调整堆栈,所以在函数返回前要恢复堆栈,先回收本地变量占用的内存(ESP=ESP+3*4),然后取出返回地址,填入EIP寄存器,回收先前压入参数占用的内存,继续执行调用者的代码.

 

        Windows下的动态数据除了可存放在栈中,还可以存放在堆中.了解C++的都知道,C++可以使用new关键字来动态分配内存.看下面C++代码:

        可以发现用new关键字分配的内存既不在栈中,也不在静态数据区.

****************************************************************************************************************

线性结构:

对于数据结构课程而言,简单地说,线性结构是n个元素的有序(次序)集合。它有四个基本特征:

  1.集合中必存在唯一的一个"第一个元素";

  2.集合中必存在唯一的一个"最后的元素";

  3.除最后元素之外,其它数据元素均有唯一的"后继";

  4.除第一元素之外,其它数据元素均有唯一的"前驱"。

  数据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构。

  如(a1,a2,a3,.....,an),a1为第一个元素,an为最后一个元素,此集合极为一个线性结构的集合。

  相对应于线性结构,非线性结构的逻辑特征是一个结点元素可能对应多个直接前驱和多个后驱。

  常用的线性结构有:线性表,栈,队列,双队列,数组,串。

      常见的非线性结构有:树(二叉树等),图(网等)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值