栈(Stack)的Python实现
前言
Python本身已有顺序表(List、Tupple)的实现,所以这里从栈开始。
什么是栈
想象一摞被堆起来的书,这就是栈。这堆书的特点是,最后被堆进去的书,永远在最上面。从这堆书里面取一本书出来,取哪本书最方便?肯定是最上面那本。栈这种数据结构的特点就是如此:后进先出(Last In First Out - LIFO),即最后被堆进去的数据,最先被拿出来。
栈的Python实现
栈可以用顺序表方式实现,也可以用链表方式实现。我大Python的内建数据结构太强大,可以用list直接实现栈,简单快捷。人生苦短,我用Python。代码如下:
class Stack(object):
# 初始化栈为空列表
def __init__(self):
self.items = []
# 判断栈是否为空,返回布尔值
def is_empty(self):
return self.items == []
# 返回栈顶元素
def peek(self):
return self.items[len(self.items) - 1]
# 返回栈的大小
def size(self):
return len(self.items)
# 把新的元素堆进栈里面(程序员喜欢把这个过程叫做压栈,入栈,进栈……)
def push(self, item):
self.items.append(item)
# 把栈顶元素丢出去(程序员喜欢把这个过程叫做出栈……)
def pop(self, item):
return self.items.pop()
if __name__ == __main__:
# 初始化一个栈对象
my_stack = Stack()
# 把'h'丢进栈里
my_stack.push('h')
# 把'a'丢进栈里
my_stack.push('a')
# 看一下栈的大小(有几个元素)
print my_stack.size()
# 打印栈顶元素
print my_stack.peek()
# 把栈顶元素丢出去,并打印出来
print my_stack.pop()
# 再看一下栈顶元素是谁
print my_stack.peek()
# 这个时候栈的大小是多少?
print my_stack.size()
# 再丢一个栈顶元素
print my_stack.pop()
# 看一下栈的大小
print my_stack.size
# 栈是不是空了?
print my_stack.is_empty()
# 哇~真好吃~
print 'Yummy~'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
Tips:
看完上面的代码,聪明的同学一定知道了,Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作。其他的数据结构在Python中也是以类似的方式实现的。
那么,这里有一些有的没的要说一下~
如果希望items[]是Stack类私有的属性,这样做就好了:
def __init__(self):
self.__items = []
- 1
- 2
没错,就是在items前面加两个下划线__,在Python中,类的私有成员就是这样定义哒~
如果希望限定Stack类的成员只有items,不要其他的怪蜀黍乱加成员,那么这样做就好了:
class Stack(object):
__slots__ = ('__items')
def __init__(self):
self.__items = []
- 1
- 2
- 3
- 4
- 5
这样就安全多啦~
Python并没有Java里的public/private/protected这样的修饰符,因为Python的设计者认为,“大家都是成年人了”~