栈(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的设计者认为,“大家都是成年人了”~

栈(Stack)的Python实现

相关推荐