前言
本篇章主要介绍栈里的栈及顺序栈,并用Python实现顺序栈的基本操作。
1. 栈
栈 ( S t a c k ) (Stack) (Stack),是一种操作受限的线性表,只允许在一端进行插入或删除操作的线性表。
栈顶:允许进行插入或删除操作的那一端。
栈底:不允许进行插入或删除操作的那一端。
栈是后进先出
(
L
a
s
t
(Last
(Last
I
n
In
In
F
i
r
s
t
First
First
O
u
t
,
L
I
F
O
)
Out,LIFO)
Out,LIFO),即假设某个栈
S
=
(
a
1
,
a
2
,
a
3
)
S=(a_1,a_2,a_3)
S=(a1,a2,a3),进栈顺序为
a
1
,
a
2
,
a
3
a_1,a_2,a_3
a1,a2,a3,出栈顺序为
a
3
,
a
2
,
a
1
a_3,a_2,a_1
a3,a2,a1。
另外,栈还有一个很重要的数学性质:
n
n
n个不同元素进栈,出栈元素不同排列的个数为
1
n
+
1
C
2
n
n
\frac {1} {n+1}C_{2n}^n
n+11C2nn,又称为卡特兰数。
2. 顺序栈
顺序栈是利用一组地址连续的存储单元来存放自栈底到栈顶的数据元素,同时带有一个top指针来指示当前栈顶的位置。
栈顶指针top:初始时设置为
−
1
-1
−1。
入栈操作:栈顶指针先加1,再将值送入栈顶元素。
出栈操作:先取栈顶元素,再将栈顶指针减1。
栈空条件: t o p = = − 1 top==-1 top==−1。
栈满条件: t o p = = M a x S i z e − 1 top==MaxSize-1 top==MaxSize−1。
栈长: t o p + 1 top+1 top+1。
具体操作时,可以按照列表的方式进行操作。
3. 基本功能
操作名称 | 操作说明 |
---|---|
CreateSequenceStack(val_list) | 创建顺序栈 |
IsEmpty() | 判断顺序栈是否为空 |
LengthStack() | 返回顺序栈的长度 |
Traverse() | 打印出顺序栈里的数据元素 |
Push(data) | 入栈 |
Pop() | 出栈 |
GetTop() | 取栈顶元素 |
4. 代码实现
class SequenceStack(object):
def __init__(self):
self.MaxStackSize = 10
self.S = [None for i in range(self.MaxStackSize)]
self.top = -1
def CreateSequenceStack(self, val_list):
"""
将列表转换成一个顺序栈
:param val_list:
:return:
"""
for val in val_list:
s1.Push(val)
def IsEmpty(self):
"""
判空
:return:
"""
if self.top == -1:
return True
else:
return False
def LengthStack(self):
"""
返回顺序栈的长度
:return:
"""
return self.top + 1
def Traverse(self):
"""
遍历顺序栈
:return:
"""
if self.IsEmpty():
print('栈为空!')
else:
for index in range(self.top + 1):
print(self.S[index], end=' ')
print('')
def Push(self, e):
"""
入栈
:param e:
:return:
"""
if self.top < self.MaxStackSize - 1:
self.top += 1
self.S[self.top] = e
else:
print('栈已满!')
def Pop(self):
"""
出栈
:return:
"""
if self.top == -1:
print('栈为空!')
return -1
else:
e = self.S[self.top]
self.top -= 1
return e
def GetTop(self):
"""
取栈顶元素
:return:
"""
if self.top == -1:
print('栈为空!')
return -1
else:
return self.S[self.top]
测试程序如下:
if __name__ == '__main__':
s1 = SequenceStack()
s1.CreateSequenceStack([1, 3, 5, 7, 9])
print('打印顺序栈s1: ', end='')
s1.Traverse()
print('顺序栈s1的长度为: %d' % s1.LengthStack())
print('顺序栈s1的栈顶元素为: %d' % s1.GetTop())
print('s1出栈: ', end='')
for i in range(s1.LengthStack()):
print(s1.Pop(), end=' ')
运行结果如下: