![数据结构(C语言实现)](https://wfqqreader-1252317822.image.myqcloud.com/cover/699/43806699/b_43806699.jpg)
3.1.3 顺序栈
1.栈的顺序存储结构
采用顺序存储结构的栈称为顺序栈。顺序栈利用一组连续的存储单元存放栈中的元素,存放顺序依次从栈底到栈顶。由于栈中元素之间的存放地址的连续性,在C语言中,同样采用数组实现栈的顺序存储。另外,增加一个栈顶指针top,用于指向顺序栈的栈顶元素。
栈的顺序存储结构类型描述如下:
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/70_01.jpg?sign=1739301397-9PENeIWjFfnUKK2OCaDfdeEYs8GGXvXr-0-c9dfd3aaee43d12d1377fbcecf0d5635)
用数组表示的顺序栈如图3.3所示。将元素A、B、C、D、E、F、G、H依次进栈,栈底元素为A,栈顶元素为H。在本书中,约定栈顶指针top指向栈顶元素的下一个位置(而不是栈顶元素)。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/70_02.jpg?sign=1739301397-0OesN3VMAlf1eQNrU072qHeyRwxmLi2O-0-9e7c01f5cbebc800e07df84eb53e4b7f)
图3.3 顺序栈结构
说明:
(1)初始时,栈为空,栈顶指针为0,即S.top=0。
(2)栈空条件为S.top==0,栈满条件为S.top==StackSize-1。
(3)进栈操作时,先将元素压入栈中,即S.stack[S.top]=e,然后使栈顶指针加1,即S.top++。出栈操作时,先使栈顶指针减1,即S.top--,然后元素出栈,即e=S.stack[S.top]。
(4)栈的长度即栈中元素的个数为S.top。
注意:当栈中元素个数为StackSize时,称为栈满。当栈满时进行入栈操作,将产生上溢错误。如果对空栈进行删除操作,将产生下溢错误。因此,在对栈进行进栈或出栈操作前,要判断栈是否已满或已空。
2.顺序栈的基本运算
顺序栈的基本运算如下(以下算法的实现保存在文件“SeqStack.h”中)。
(1)栈的初始化。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/70_03.jpg?sign=1739301397-yEGeG8vGB2X9QkzhqRA4xsXu7BGdB1x5-0-ac4cf6de4bdcfcebe849916c31a48472)
(2)判断栈是否为空。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/71_01.jpg?sign=1739301397-l0lV6mX8RNsLcj4lGi9it1Z33Hdf2mSN-0-c0263eb4db89fd1df35ee58a069bcd60)
(3)取栈顶元素。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/71_02.jpg?sign=1739301397-V1uGEOCiPcX89evdvnoze6MwlgPsjlJQ-0-b65b6be38aeb2c6e57f03bbb88eab86e)
注意:取栈顶元素并不是将元素出栈,这里的操作是S.stack[S.top-1],并没有修改栈顶指针top的值,即不能写作S.stack[-S.top]或S.stack[S.top-1]。
(4)进栈操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/71_03.jpg?sign=1739301397-8AsF7pE9yqTpckgGRiwJvjv8Bo5MyLnl-0-0d6fe3bd72babe5aa870e739c1519ff8)
(5)出栈操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/71_04.jpg?sign=1739301397-1sDpsUnMyvGd8IzQY91fcWu12qTzRb9b-0-6caba1e7d7ef832134028c8cced2feb6)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_01.jpg?sign=1739301397-T8oxMFxHCSvFO2Y5P3L1ty4kmEoa0tql-0-c706fc5cd3933e88be5ed9eb86b43f21)
(6)返回栈的长度。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_02.jpg?sign=1739301397-3juVTPvWEnlhIGqRClUPkOtvEPB9gvfI-0-566b5e3c3ba5d79756636ccf95ea10b7)
(7)清空栈。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_05.jpg?sign=1739301397-7TelKEmDSxf79Mtsc4Md82bWaWpK99hQ-0-4801c96230e455c40910084861faa223)
3.共享栈*
栈的应用非常广泛,经常会出现一个程序需要同时使用多个栈的情况。使用顺序栈会因为栈空间的大小难以准确估计,从而造成有的栈溢出,有的栈还有空闲。为了解决这个问题,可以让多个栈共享一个足够大的连续存储空间,利用栈的动态特性使栈空间能够互相补充,存储空间从而得到有效利用,这就是栈的共享,这些栈被称为共享栈。
在栈的共享问题中,最常用的是两个栈的共享。共享栈主要通过栈底固定、栈顶迎面增长的方式实现。让两个栈共享一个一维数组stack[StackSize],两个栈底设置在数组的两端,当有元素进栈时,栈顶位置从栈的两端向中间迎面增长;当两个栈顶相遇时,栈满。
共享栈(两个栈共享一个连续的存储空间)的数据结构类型描述如下。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_03.jpg?sign=1739301397-gfxGaWoClpeIPA3ZX3NyBjqbTfLblgL7-0-29fb5723d25045d347de2f0f68f436e2)
其中,top[0]和top[1]分别是两个栈的栈顶指针。
例如,共享栈的存储表示如图3.4所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_04.jpg?sign=1739301397-riGwQBG1ApWxJQ5Lv0ngwn4siWaVIszS-0-d85ef7541fe3cbc071416f46c75c9318)
图3.4 共享栈示意图
共享栈的算法操作(以下算法保存在文件“SSeqStack.h”中)如下。
(1)初始化。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/73_01.jpg?sign=1739301397-bDfdzLpkrmItpBqSli2NhVB6p6PbPZc6-0-d67253f5ca7b7b50318f1579955bdaba)
(2)进栈操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/73_02.jpg?sign=1739301397-fnScobN5mF6GPkR9kpBl9KTwFrQkCGxu-0-9a9df648b2f7e8887a6f54f9ca5f0a6b)
(3)出栈操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/73_03.jpg?sign=1739301397-yDua7kWVcYsENIsqkfb8oM5b2nLb6fjA-0-6ea2724d4712d487a2974ecae9cc0bee)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/74_01.jpg?sign=1739301397-hCRbrxSmHsRXWZh57Qg1lDKr0ZeGyzN5-0-69a0bf4481ce30e0e0ad2fd671d439e3)