入栈为什么时间操作
⑴ 数据结构 为什么入栈和出栈的操作,这两本书讲的完全反的
本质是一样的。。只要它做到的事相同,空间与时间复杂度相同,内部怎样实现其实没有什么区别,(那里也说了其他书会有不同规定)所以其实更准确的数据结构操作描述应当是伪代码。
这些它给的代码只是让你不需要如此抽象理解,具体的可以看一下用于加深理解。
而实际更标准的数据结构实现应该看STL的,但是它的代码比较难以理解就是了。
总结是,这本书的问题,书不够权威,因此不够准确。
⑵ 栈的入栈和出栈的顺序规律是什么
入栈的顺序规律是排在前面的先进,排在后面的后进。
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。
向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
要搞清楚这个概念,首先要明白”栈“原来的意思,如此才能把握本质。栈,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。
首先系统或者数据结构栈中数据内容的读取与插入(压入push和 弹出pop)是两回事!压入是增加数据,弹出是删除数据 ,这些操作只能从栈顶即最低地址作为约束的接口界面入手操作 ,但读取栈中的数据是随便的没有接口约束之说。
很多人都误解这个理念从而对栈产生困惑。而系统栈在计算机体系结构中又起到一个跨部件交互的媒介区域的作用 即 cpu 与内存的交流通道 ,cpu只从系统给我们自己编写的应用程序所规定的栈入口线性地读取执行指令, 用一个形象的词来形容它就是pipeline(管道线、流水线)。cpu内部交互具体参见 EU与BIU的概念介绍。
⑶ 入栈操作的问题
这个 是 ++(--)的前置与后置的问题。
前置的话先用变量,然后再自增(减)
后置的话先自增(减)后用变量
所以
data[++top]=x的含义就是:
top=top+1; //top++
data[top]=x;
data[top++]=x的含义就是:
data[top]=x;
top=top+1; //top++
所以你用后一种就是 把 栈顶元素被 x 替换,丢失原先栈顶元素,然后栈顶又+1,其值为 赋,(随机)
⑷ 对顺序栈入栈时要进行什么操作
什么是栈栈实际上也是线性表,只不过是一种特殊的线性表。在这种特殊的线性表中,其插入与删除运算都只在线性表的一端进行。即在这种线性表的结构中,一端是封闭的,不允许进行插入与删除元素;另一端是开口的,允许插入与删除元素。在顺序存储结构下,对这种类型线性表的插入与删除运算是不需要移动表中其他数据元素的。这种线性表称为栈。
线是限定在一端进行插入与删除的线性表。
在栈中,允许插入与删除的一端称为栈顶,而不允许插入与删除的另一端称为栈底。栈顶元素总是最后被插入的元素,从而也是最先能被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。即栈是按照“先进后出”或“后进先出”的原则组织数据的,因此,栈也被称为“先进后出”表或“后进先出”表。由此可以看出,栈具有记忆作用。
通常用指针top来指示栈顶的位置,用指针bottom指向栈底。
往栈中插入一个元素称为入栈运算,从栈中删除一个元素(即删除栈顶元素)称为退栈运算。
栈的顺序存储及其运算
与一般的线性表一样,在程序设计语言中,用一维数组S(1:m)作为栈的顺序存储空是,其中m为栈的最大容量。S(bottom)通常为栈底元素(在栈非空的情况下),s(top)为栈顶元素。Top-0表示栈空;top=m表示栈满。
栈的基本运算有三种:入栈、退栈与读栈顶元素。
入栈运算入栈运算是指在栈顶位置插入一个新元素。这个运算有两个基本操作:道德将栈顶指针进一(即top加1),然后将新元素插入到栈顶指针指向的位置。
当栈顶指针已经指向存储空间的最后一个位置时,说明栈空间已满,不可能再进行入栈操作。这种情况称为栈“上溢”错误。
退栈运算退栈运算是指取出栈顶元素并赋给一个指定的变量。这个运算有两个基本操作:道德将栈顶元素(栈顶指针指向的元素)赋给一个指定的变量。然后将栈顶指针退一(即top减1)。
当栈顶指针为0时,说明栈空,不可能进行退栈操作。这种情况称为栈“下溢”错误码。
读栈顶元素读栈顶元素是指将栈顶元素赋给一个指定的变量。必须注意,这个运算不删除栈顶元素,只是将的值赋给一个变量,因此,在这个运算中,栈顶指针不会改变。
当栈顶指针为0时,说明栈空,读不到栈顶元素。
⑸ 请解释一下入栈运算和退栈运算,最好用举例子的方法,特别搞不懂栈顶指针的位置是怎么回事
栈(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
栈是一种数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈是只能在某一端插入和删除的特殊线性表。用桶堆积物品,先堆进来的压在底下,随后一件一件往堆。取走时,只能从上面一件一件取。堆和取都在顶部进行,底部一般是不动的。
栈就是一种类似桶堆积物品的数据结构,进行删除和插入的一端称栈顶,另一堆称栈底。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO表)。
例如:有一个数列(23,45,3,7,3,945)
我们先对其进行进栈操作,则进栈顺序为:23,45,3,7,3,945
我们在对其进行出栈操作,则出栈顺序为:945,3,7,3,45,23
进栈出栈就像只有一个口的长筒,先把数据一个个放入筒内,而拿出的时候只有先拿走上边的,才能拿走下边的。
⑹ 入栈和出栈的顺序规律是什么
入栈的顺序规律是排在前面的先进,排在后面的后进。
①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
②置TOP=TOP+1(栈指针加1,指向进栈地址);
③S(TOP)=X,结束(X为新进栈的元素);
出栈的顺序规律是排在前面的先出,排在后面的后出。
①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);
②X=S(TOP),(退栈后的元素赋给X):
③TOP=TOP-1,结束(栈指针减1,指向栈顶)。
(6)入栈为什么时间操作扩展阅读:
栈允许在同一端进行插入和删除操作。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。
栈在程序的运行中有着举足轻重的作用。栈可以用来在函数调用的时候存储断点,做递归时要用到栈。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。
⑺ 关于入栈,出栈指针和数据操作顺序的疑问
楼主,堆栈是一个抽象数据类型,规定的两项必备的基本操作分别为入栈和出栈。这个抽象数据类型并没规定入栈与出栈具体要怎么实现。你问的问题已经在实现这一层面上,所以按照堆栈这种抽象数据类型的规定看,“先修改指针,然后插入数据,出栈时刚好相反”并不是必须的,这取决于你的操作的具体实现。
如果你的堆栈的实现是往上长的(就是说往顶的方向长,其实质是你的栈底是定死的不能动,入栈的东西只能不断往上叠,这就像你在书桌上放书一样,桌底是定死的,所以你的书只能一本一本地往上堆,往上长),计算机内部的堆栈的实现采取的就是这种模式,所以就得像你说的那样,“先修改指针,然后插入数据,出栈时刚好相反”,因为你堆栈指针指向的总是栈顶元素,栈底不能动,所以数据入栈前要先修改指针使它指向新的空余空间然后再把数据存进去,出栈的时候自然相反,你联系我上面举的放书的例子仔细想想。
然而,如果你的堆栈的实现是往下长的(就是说你每压一个元素入栈,栈底就自动下移一个元素的位置,其实质就是这种堆栈模型是一个“无底洞”型),这个时候,你的栈顶就变成了定死的,你就可以先压入元素,然后再修改指针。因为你的栈底是无限的,你压入一个元素,新的元素就取代先前的栈顶元素占据栈顶的位置,那么你先前的指向栈顶元素的指针这个时候就该修改让它指向这个新的栈顶元素了。
下面的就是对“无底洞”型堆栈的一种实现的描述:
压栈(入栈):将对象或者数据压入栈中,更新栈顶指针,使其指向最后入栈的对象或数据。
弹栈(出栈):返回栈顶指向的对象或数据,并从栈中删除该对象或数据,更新栈顶。
话说回来,计算机内部肯定选第一种模型,不会选第二种,因为第二种模型,每压入一个新的元素,都需要把之前堆栈里的所有元素整体下移动一个元素的位置,腾出栈顶元素的位置让新的元素进来,这种平移可是一笔不小的开销啊!但是并不是说“无底洞”模型就没办法实现了,其实它可以通过第一种模型来模拟的,每需要压入一个新的元素的时候,就先开辟一个空间,数据存入这个空间,然后再修改栈顶元素指针使其指向这个新的栈顶元素。
换句话说,用链表的话,只要有足够的空间可开辟出来作为一个节点,那么两种堆栈模型都能实现(当然“无底洞”型还是如我上面说的那样用第一种模拟出来的,否则平移的工作量相当可观),如果用数组,由于数组在内存中是连续分配出来的空间,用第一种模型更自然一些。
⑻ 详细说明堆栈的功能及操作原理,及堆栈操作时如何入栈和出栈.
看数据结构啊。后进先出。