什么是栈空、栈满啊?

来源:百度知道 编辑:UC知道 时间:2024/06/17 16:17:01
我在自学。有道题说:利用top表示栈顶指针,top=n+1表示栈空,该数组所能存储的栈的最大长度为n,则表示栈满的条件是top=1。
类似的,top=0,表示栈空;top=n时栈满。
栈空栈满,什么意思?为什么表示方法如上?
其实我理解第二道题的意思,但是第一题呢?

因为堆栈是从底忘上存储数据的,你每存一个即top要向上移动一次.当栈空时,堆栈为存储任何数据,top指向堆栈的底部,栈满时,top指向栈顶.

若采用第二种方法,每压栈一次top加1,当加到n时,则表示栈满

会有那道题吗?我没看出来,只知道栈的内容包括数据域还有个类似指针的的标志域,开始时,栈为空top指的位置就是将要插入数据的位置,top=0,有一个数进栈,top就会加一,直到栈满了为止,top=n,为止.出栈就是top先减一,再取数据.我就知道这么多!

栈空和栈满:
1.
定义一段地址为一个栈,这段地址是10000~1FFFF,当栈满时,问题很简单,ss=1000,sp=0,使ss:sp指向栈顶元素,但是当栈空时,没有一个元素,sp等于多少呢?

2.
由此我们先来研究一个简单的问题,假设有一个只能放一个数据的栈,从10000到10001,只能放一个数据,当栈空时,要指向栈顶元素,为了符合前面提到的push的规则,就是送入数据时要把sp+2,所以就只好指向10001下面那个地址了,也就是1000:0002,这样也就符合了push的规则。

3.
所以我们就可以来研究上面那个问题了,栈空时,sp应该指向1FFFE下面那个数据的地址这时偏移地址sp=FFFE+2=10000,因为一个寄存器只能存储4位的16进制数,所以发生了溢出,sp=0000,所以这时栈顶元素的地址是1000:0,从栈空时的sp=0,一直压栈直到栈满时sp=0;如果再次压栈,栈顶将形成循环,覆盖了原来栈中的内容,所以8086
CPU的栈机制是循环的,而且栈的最大空间是64KB。

4.
可以在DOS下进行实验,进入DOS输入debug,用a命令写下如下代码

mov ax,1000

mov ss,ax

mov sp,0000 (定义了一个从10000到1FFFE的栈)

mov ax,0001

push ax