![数据结构(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=1739114741-THW7uETZxDUVudVHjcXqqTI61FgQghpW-0-f7621c4ce9817ca33d8c78070778e4e1)
用数组表示的顺序栈如图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=1739114741-El5Yw0AVIOMqTgTq3Ip8KZyyDAQlOhoL-0-b318b03fad0da9c41a43f5e9d63cf092)
图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=1739114741-Sj5X2hT4AaLYyqlVfTyzGa5L4c0rtxuH-0-2d9b3269ef428d2f565bc17f6d6f2662)
(2)判断栈是否为空。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/71_01.jpg?sign=1739114741-WParTE0qbr3f52PhWL0mfo9YZzzEm9jC-0-802374e91f60f94a9d53417df9d7e15f)
(3)取栈顶元素。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/71_02.jpg?sign=1739114741-UHz57LHxotAkGI68br05DyeflblmZU5k-0-a5dd77f70d7f478ea588ece90fb5aa8a)
注意:取栈顶元素并不是将元素出栈,这里的操作是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=1739114741-JUn5Dob9Nev5RUfL9nM1KzYkcEQgCO6I-0-4ab1b539e63b160b3ecc9abc1621ed04)
(5)出栈操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/71_04.jpg?sign=1739114741-rZPLOKEMbPvBX2Xsfl4zODBPz5D7m3aA-0-020331a1d0627c81f0991e716aa54094)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_01.jpg?sign=1739114741-CzpHZR0YDO2zIJYRtrxlpZMkfCahVmzM-0-da71ff3b55857f68ddac6e6167133882)
(6)返回栈的长度。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_02.jpg?sign=1739114741-NgIKK2Pkd8pCH6JQjUWtOJSnDm0fnHyI-0-4dd43c595b5afc0aec507ae88e9e3d5d)
(7)清空栈。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_05.jpg?sign=1739114741-zDZSMtC7UDNTqE7msJNU4HO8qdk4fdwe-0-4833e3ebe61a1181467c0f3ee75549c5)
3.共享栈*
栈的应用非常广泛,经常会出现一个程序需要同时使用多个栈的情况。使用顺序栈会因为栈空间的大小难以准确估计,从而造成有的栈溢出,有的栈还有空闲。为了解决这个问题,可以让多个栈共享一个足够大的连续存储空间,利用栈的动态特性使栈空间能够互相补充,存储空间从而得到有效利用,这就是栈的共享,这些栈被称为共享栈。
在栈的共享问题中,最常用的是两个栈的共享。共享栈主要通过栈底固定、栈顶迎面增长的方式实现。让两个栈共享一个一维数组stack[StackSize],两个栈底设置在数组的两端,当有元素进栈时,栈顶位置从栈的两端向中间迎面增长;当两个栈顶相遇时,栈满。
共享栈(两个栈共享一个连续的存储空间)的数据结构类型描述如下。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_03.jpg?sign=1739114741-yEYBKqLh2Pqf77uIsxGXNFIas22zeqoK-0-d6f654adbf8028e71436dc8a21cc7e39)
其中,top[0]和top[1]分别是两个栈的栈顶指针。
例如,共享栈的存储表示如图3.4所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_04.jpg?sign=1739114741-rSoNc3IzI2Hf3bPNM2DDbuC9d12F5CzT-0-2af00e7193eaecbefa188fe7c35bc50a)
图3.4 共享栈示意图
共享栈的算法操作(以下算法保存在文件“SSeqStack.h”中)如下。
(1)初始化。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/73_01.jpg?sign=1739114741-naG97KSGCLykf02XmWND1ORw8btvCz18-0-1680aee2fd77b82e695bff81dd71eeff)
(2)进栈操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/73_02.jpg?sign=1739114741-Fxj87Zzz7VOhi0Omd0GYQErbQ7M7XTab-0-f215778145f9dfac91f3bb914f6e5478)
(3)出栈操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/73_03.jpg?sign=1739114741-CR7NUKEvTEmDF7gDLLpSv4bKslOk4ZfD-0-106e7727febb6d870ee620c5755d6231)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/74_01.jpg?sign=1739114741-GvVALAjDxcMFf6sHlFWFoZXLqgSlGM6K-0-1dceffac40c9e9246e435cc1c5338457)