![数据结构(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=1738885289-0TehZhFbZNYrVSFKd3dH37dYFtqgYPeK-0-9f2997b2d0ce1054f327e0a0e32e68d0)
用数组表示的顺序栈如图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=1738885289-f6YSUDH6tDWCD4qQZlLhFGyMZO3kDUPo-0-2167622b2e39fe660a239bb4ce59e50f)
图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=1738885289-jS8A6f0ZqCzaCsAQ2VO8UM09hVuwYPqI-0-24543fb5b4f303980b9b78e2215b4e18)
(2)判断栈是否为空。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/71_01.jpg?sign=1738885289-X8belFm4mssrb47qZVhF15wqg7xsQCaB-0-44cd0ad7d2bfd21e954106f50877298d)
(3)取栈顶元素。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/71_02.jpg?sign=1738885289-rytzPzJFAfM42WnU5xPDzV2GRnTOwY4R-0-d22bb81fcdfbe5b019019f1d77020e83)
注意:取栈顶元素并不是将元素出栈,这里的操作是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=1738885289-hQAVl1jkXpbaWNGhkIjDKWSqfQygMqXl-0-970b5bfb57581c3b44cb1a89b4feede3)
(5)出栈操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/71_04.jpg?sign=1738885289-RI8pfuf4cFt2VfajVSr9Tv2R4fKSVQbT-0-8f5fecc0829f9b08e0ac8493f425329b)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_01.jpg?sign=1738885289-Aaj0iqsXRIcwwTgpwxefQEi0Eux51gb0-0-b7f24d54a12b2028be25bacb9829470d)
(6)返回栈的长度。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_02.jpg?sign=1738885289-0X67qADAsauVBdq46hqgPiaTpWLabmT8-0-06f264036028c0ccff905b23212e7916)
(7)清空栈。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_05.jpg?sign=1738885289-nRa0NT9o0ofysvW0Y6oItijQTA6fLCq4-0-9352cbf669141d708f3d9b44fc86848e)
3.共享栈*
栈的应用非常广泛,经常会出现一个程序需要同时使用多个栈的情况。使用顺序栈会因为栈空间的大小难以准确估计,从而造成有的栈溢出,有的栈还有空闲。为了解决这个问题,可以让多个栈共享一个足够大的连续存储空间,利用栈的动态特性使栈空间能够互相补充,存储空间从而得到有效利用,这就是栈的共享,这些栈被称为共享栈。
在栈的共享问题中,最常用的是两个栈的共享。共享栈主要通过栈底固定、栈顶迎面增长的方式实现。让两个栈共享一个一维数组stack[StackSize],两个栈底设置在数组的两端,当有元素进栈时,栈顶位置从栈的两端向中间迎面增长;当两个栈顶相遇时,栈满。
共享栈(两个栈共享一个连续的存储空间)的数据结构类型描述如下。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_03.jpg?sign=1738885289-WtHvZHYEkrYqpCMSikHGKxbH6JZDnDzi-0-5a6b75a832d6f75323b968dbda0f3cb3)
其中,top[0]和top[1]分别是两个栈的栈顶指针。
例如,共享栈的存储表示如图3.4所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_04.jpg?sign=1738885289-ehFGqwar1So6T4BGRjfxe0cw2aBMXcLb-0-2037eca7aed5ba590010fd8e2ecd5281)
图3.4 共享栈示意图
共享栈的算法操作(以下算法保存在文件“SSeqStack.h”中)如下。
(1)初始化。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/73_01.jpg?sign=1738885289-Z62XG4JUCDbNLzMEPtpKJr0rZXtcGanE-0-cc4d42ca02a957c54ecc3648ece9abca)
(2)进栈操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/73_02.jpg?sign=1738885289-O6U8qBJashYnCbDkYiRGyzaDkyJ6m4NO-0-aad9a87352c2be4ad258324b4e722eef)
(3)出栈操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/73_03.jpg?sign=1738885289-9RllI8RgzNP5vxjZBkBvN0ZFGgtPfHyK-0-0e62714734066eaeb52419cbdc64ed3b)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/74_01.jpg?sign=1738885289-Uxiqb8E4K0LpDxYpPNvVNRDYUFIAB3tz-0-e7cc99d9650962372308e4be959118eb)