您好、欢迎来到现金彩票网!
当前位置:老k棋牌 > 栈指针 >

关于入栈出栈指针和数据操作顺序的疑问

发布时间:2019-07-31 09:49 来源:未知 编辑:admin

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  展开全部楼主,堆栈是一个抽象数据类型,规定的两项必备的基本操作分别为入栈和出栈。这个抽象数据类型并没规定入栈与出栈具体要怎么实现。你问的问题已经在实现这一层面上,所以按照堆栈这种抽象数据类型的规定看,“先修改指针,然后插入数据,出栈时刚好相反”并不是必须的,这取决于你的操作的具体实现。

  如果你的堆栈的实现是往上长的(就是说往顶的方向长,其实质是你的栈底是定死的不能动,入栈的东西只能不断往上叠,这就像你在书桌上放书一样,桌底是定死的,所以你的书只能一本一本地往上堆,往上长),计算机内部的堆栈的实现采取的就是这种模式,所以就得像你说的那样,“先修改指针,然后插入数据,出栈时刚好相反”,因为你堆栈指针指向的总是栈顶元素,栈底不能动,所以数据入栈前要先修改指针使它指向新的空余空间然后再把数据存进去,出栈的时候自然相反,你联系我上面举的放书的例子仔细想想。

  然而,如果你的堆栈的实现是往下长的(就是说你每压一个元素入栈,栈底就自动下移一个元素的位置,其实质就是这种堆栈模型是一个“无底洞”型),这个时候,你的栈顶就变成了定死的,你就可以先压入元素,然后再修改指针。因为你的栈底是无限的,你压入一个元素,新的元素就取代先前的栈顶元素占据栈顶的位置,那么你先前的指向栈顶元素的指针这个时候就该修改让它指向这个新的栈顶元素了。

  压栈(入栈):将对象或者数据压入栈中,更新栈顶指针,使其指向最后入栈的对象或数据。

  弹栈(出栈):返回栈顶指向的对象或数据,并从栈中删除该对象或数据,更新栈顶。

  话说回来,计算机内部肯定选第一种模型,不会选第二种,因为第二种模型,每压入一个新的元素,都需要把之前堆栈里的所有元素整体下移动一个元素的位置,腾出栈顶元素的位置让新的元素进来,这种平移可是一笔不小的开销啊!但是并不是说“无底洞”模型就没办法实现了,其实它可以通过第一种模型来模拟的,每需要压入一个新的元素的时候,就先开辟一个空间,数据存入这个空间,然后再修改栈顶元素指针使其指向这个新的栈顶元素。

  换句话说,用链表的话,只要有足够的空间可开辟出来作为一个节点,那么两种堆栈模型都能实现(当然“无底洞”型还是如我上面说的那样用第一种模拟出来的,否则平移的工作量相当可观),如果用数组,由于数组在内存中是连续分配出来的空间,用第一种模型更自然一些。

  展开全部形象的说, 栈 就是一个上面有标签栏的桶. 标签栏(类似超女投票的那种)就代表指针.桶底就是栈底.桶顶就是栈顶. 拿一个东西准备放入桶,先要往里面扔一个标签(指针定位).然后在把东西(数据)放进桶里.

  可以想象一下.后放进去的东西总是压在前一个东西的上面.要拿的话也是先拿最后一个.

  有的把初始top=-1 当然是要先加再入咯 或者的top=0时候可以入再加 也可以先加再入 还有一个问题是看你的栈顶是不是作为空的来处理

  最后一点是出栈和入栈操作的对称的前面是++top的话 后面就的top--

  展开全部打个比方:假如你是房东,有人要住你的房子,那他住进来前你肯定要先把房子腾空,然后让他住进来;反之,如果你不租给他住了,肯定是要先把房客赶出去,然后再使用空出来的房子。

  展开全部堆栈主要用于储存临时数据、本地变量和中断、子程序调用产生后的返回地址。堆栈指针寄存器通常指向堆栈的顶部。注意堆栈的执行是从较高的存储器地址到较低的存储器地址。

  也就是说,一条堆栈PUSH命令会使堆栈指针减小堆栈指针指向数据SRAM堆栈区域中子程序和中断堆栈被定位的位置。在任何子程序被调用或中断被使能之前,位于数据SRAM中的这一堆栈空间必须由程序定义好。堆栈指针必须被设在0x60之上。当使用PUSH指令向堆栈中压入一个数据时,堆栈指针自动减1;而当返回地址被子程序调用或中断压入堆栈时,堆栈指针自动减2。当使用POP指令把一个数据从堆栈中弹出时,堆栈指针自动加1;而由子程序的RET或中断程序的RETI弹出数据时,堆栈指针自动加2。

http://advntravel.com/zhanzhizhen/205.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有