前言
本篇章主要介绍链栈,并用Python实现其基本操作。
1. 链栈
顺序栈操作简单,但是它需要预先定义栈的大小,通常我们没办法事先知道数据量的大小,如果资源申请多了就会浪费,少了又不行,所以我们使用链栈来动态申请资源,即用多少申请多少。
链栈是栈的链式存储结构,在单链表的基础上进行操作,而且与单链表不同的是,链栈的入栈、出栈都是在表头进行操作的。其结点的定义与单链表的一样:
class LinkNode(object):
def __init__(self, data=None, next=None):
self.data= data
self.next = next
2. 基本操作
操作名称 | 操作说明 |
---|---|
CreateLinkStack(val_list) | 创建链栈 |
IsEmpty() | 判断链栈是否为空 |
LengthStack() | 返回链栈的长度 |
Traverse() | 打印出链栈里的数据元素 |
Push(data) | 入栈 |
Pop() | 出栈 |
GetTop() | 取栈顶元素 |
3. 代码实现
class LinkStack(object):
"""
与顺序栈不同的是, 链栈的入栈和出栈操作只在表头进行
"""
def __init__(self):
self.top = LinkNode(None)
def CreateLinkStack(self, val_list):
for data in val_list:
s1.Push(data)
def IsEmpty(self):
if self.top.next:
return False
else:
return True
def LengthStack(self):
perhead = self.top
count = 0
while perhead.next:
count += 1
perhead = perhead.next
return count
def Traverse(self):
if self.IsEmpty():
print('栈为空!')
else:
perhead = self.top
while perhead.next:
perhead = perhead.next
print(perhead.data, end=' ')
print('')
def Push(self, e):
new_node = LinkNode(e)
new_node.next = self.top.next
self.top.next = new_node
def Pop(self):
if self.IsEmpty():
print('栈为空!')
return -1
else:
temp = self.top.next
self.top.next = temp.next
return temp.data
def GetTop(self):
if self.IsEmpty():
print('栈为空!')
return -1
else:
return self.top.next.data
测试代码如下:
if __name__ == '__main__':
s1 = LinkStack()
s1.CreateLinkStack([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=' ')
运行结果如下: