栈是不是数据的一种存储结构
我是这样理解的:栈的存储空间为S(1:m),表示有一个栈(stack),这个栈在假想的内存中分配了1到m这一段的空间。
这里的1和m是表示内存的一块地方。
1表示内存里面用来存放第一个数据的地方。
2就是第二块地方,以此类推。。。因此栈中一共有30个地方来存放最多30个数据。
这里的1和m就是一个标号。也叫下标,可以用来索引栈中存放的数据,所以用s表示栈中第一个元素(数据)。
当你要实现一种数据结构的时候。你就要考虑两方面。一方面是如何存储,另一方面是它支持啥操作,如何在逻辑上实现这些操作。
栈就像一个杯子,只能进不能出。所以先进去的会在后面出来(这里不考虑流体)。所以栈有两种操作入栈(push)和出栈(也可叫弹出)(pop)。
第一点如何存储,我们就采用线性表(linear list)来存。线性表的特点就是数据串在一条线上,上一个挨着下一个。典型的就是数组,如果不知道数组,你可以想象成一些数据穿成一串。
接下来是它支持的操作。如何实现出栈和入栈呢?假如栈里有数据。要实现出栈就得把栈里面最上面的东西拿出来。那我就得知道最上面的是啥。这就是top。top本质上和1到m一样,是一个索引,用来指示栈顶元素并且可以引用元素。所以我就可以用S[top]来得到栈顶元素。这样栈顶元素被取出。取出后栈顶就不再是top。又由于它是线性表,所以取出后可以移动top向下让top可以索引到新的栈顶。
入栈刚好相反,如果要在杯子中装入一个数据,就要在最上面
再放
上一个数据。因此top向上移动,此时top指向新的栈顶。并且将新数据存入S[top]。top始终用来指示栈顶的元素。这就不得不考虑两种特殊情况。栈满和栈空。
栈满时,top处在线性表的边界
,再存入数据就要存到外面去了。因此要判断top是否已经到达了栈顶
。当栈空时,栈内没有数据,不能再弹出数据。top自然不能再指向存储空间内(1,m)的任意一个元素。那他应该指向何方?它应该指向存储空间外的一个区域,显然当只有一个数据在栈中,top应该按照原来出栈的方向移动(就是存入数据时移动的相反方向,也是栈开口的相反方向,也就是使劲往栈底里钻)。
所以栈空时top虽然可以指向任意一块存储空间外的区域。但是指向栈底向外的临近一个,这样入栈时top往栈顶方向移动一个,出栈后栈空时,往栈底方向移动一个。就很方便。
需要说明的是top还有两种类型,一种是指向即将压入的元素,一种是指向最近压入的元素。但无论如何,初始状态top=m+1指向存储区间外,所以初始状态是栈空。而且还是top指向最近压入元素的那种栈空。并且由于栈空是m+1,入栈时候top应该自减,也就是这个栈是个倒栈。
上一篇: 标文件中的ts是什么意思
下一篇: 树状月季一年长几公分