![数据结构(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=1739465551-pNjJYjKNRu5f3n3OXVIZz8iAeiuqW4wm-0-95c337e15bb58a3806e6adf90d24355e)
用数组表示的顺序栈如图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=1739465551-LENR9QEnfcR5pqZIGNpiPidKnHx262uS-0-15c712d140674a6f5c307a117f3168c3)
图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=1739465551-UZNkl1mF4aqanIo2WR97qLTzYuUcbofY-0-27188757e159ade74cb83d3eda0e9929)
(2)判断栈是否为空。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/71_01.jpg?sign=1739465551-MraFcVir58PgU5lOX4IsFoolCelbyeWy-0-b8aec309caf69431597e6113ae181e91)
(3)取栈顶元素。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/71_02.jpg?sign=1739465551-8raC0hL9Y49b4NarjJa55rc5E2o2fvUZ-0-ff80ea56d8306219c1ec219c984e78e9)
注意:取栈顶元素并不是将元素出栈,这里的操作是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=1739465551-D3i5WBTxYKauJ8M6mgvdxRQ9lb1maxhv-0-c1b3dd474f257c20c4596bc8e4f490d7)
(5)出栈操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/71_04.jpg?sign=1739465551-QMw2BgN1VxenvB8Q9HYlOKXZO7lPnfhr-0-831c0d01e556f8962b9d994bb6813e27)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_01.jpg?sign=1739465551-7OtanL3EqtMonF6egnoPpPT8HBBtrtJR-0-3620c6478b9f09feb0f2482aa9522353)
(6)返回栈的长度。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_02.jpg?sign=1739465551-0D0EI86kfm6vcDfNrqVs8CqWSSLJW1KK-0-786ea812b908ccb64b09b6afaed382b7)
(7)清空栈。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_05.jpg?sign=1739465551-7wlfRXKjKFlR8HP4XePWMWOjwfEfpnFw-0-a604f849763198328d0d88b8dcc896c4)
3.共享栈*
栈的应用非常广泛,经常会出现一个程序需要同时使用多个栈的情况。使用顺序栈会因为栈空间的大小难以准确估计,从而造成有的栈溢出,有的栈还有空闲。为了解决这个问题,可以让多个栈共享一个足够大的连续存储空间,利用栈的动态特性使栈空间能够互相补充,存储空间从而得到有效利用,这就是栈的共享,这些栈被称为共享栈。
在栈的共享问题中,最常用的是两个栈的共享。共享栈主要通过栈底固定、栈顶迎面增长的方式实现。让两个栈共享一个一维数组stack[StackSize],两个栈底设置在数组的两端,当有元素进栈时,栈顶位置从栈的两端向中间迎面增长;当两个栈顶相遇时,栈满。
共享栈(两个栈共享一个连续的存储空间)的数据结构类型描述如下。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_03.jpg?sign=1739465551-AKRTNH7r3BxhpziAl10HQpgPcisQSxQG-0-7b42233c53aade14519d616a01bbfcb1)
其中,top[0]和top[1]分别是两个栈的栈顶指针。
例如,共享栈的存储表示如图3.4所示。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/72_04.jpg?sign=1739465551-DEhmQCaSNaOKIkDmtsTKL1psUW03Aa4s-0-67b1528a05e71917cc200d90be6e1769)
图3.4 共享栈示意图
共享栈的算法操作(以下算法保存在文件“SSeqStack.h”中)如下。
(1)初始化。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/73_01.jpg?sign=1739465551-kkEaULognVA0edCFmoa0cvcZRI0Gciba-0-1c6172ec654d7772f553e2d25e888040)
(2)进栈操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/73_02.jpg?sign=1739465551-Ox2iK7Dbn3yTwq7OwwkUOsn5kYgM79DZ-0-5c6283b2451356e5ed42e0c173f78f8f)
(3)出栈操作。
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/73_03.jpg?sign=1739465551-m9K8pwziRXPj4MwHhyv9QFnfIudV7mvW-0-d8f5582bcb09fbdc9b715fb25dd82e4d)
![](https://epubservercos.yuewen.com/2EFA35/23083815801896206/epubprivate/OEBPS/Images/74_01.jpg?sign=1739465551-SHqcI5cV3jIKSLIgkC7DpilRInCPn7xx-0-4c95137f71b8c58e06ad08bd81fc97c3)