1. 栈的概念
栈,有些地方称为堆栈,是一种容器,可 存入数据元素、访问元素和删除元素
,它的特点在于 只能允许在容器的一端进行加入数据和输出数据的运算
。没有了位置概念
,保证 任何时候可以访问、删除的元素都是此前最后存入的那个元素
,确定了一种默认的访问顺序。由于栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。
2. 栈的实现
栈可以 用顺序表实现,也可以用链表实现
。栈的操作有创建一个新的空栈、添加一个新的元素到栈顶、弹出栈顶元素、返回栈顶元素、判断栈是否为空和返回栈的元素个数。我们选择使用顺序表来实现一个栈,Python中的列表实质按照顺序表来存储的,这里就借助列表来实现:
class Stack():
def __init__(self):
self.__items = [] # 不希望操作栈的人直接操作内部容器:可以绕过push和pop,直接对头尾操作
def push(self, item):
"""
压栈:添加一个新元素item到栈顶
:param item: 压入栈顶的元素
:return:
"""
# self.__items.insert(0,item)
self.__items.append(item)
def pop(self):
"""
出栈:弹出栈顶元素
:return:弹出的元素
"""
# self.__items.pop(0)
return self.__items.pop()
def peek(self):
"""
返回栈顶元素
:return:
"""
return self.__items[-1] if self.__items else None
def is_empty(self):
"""
判断栈是否为空
:return: True or False
"""
# return self.__items == []
return not self.__items
def size(self):
"""
返回栈的大小
:return:
"""
return len(self.__items)
if __name__ == '__main__':
s = Stack()
print('压栈...')
s.push(1)
s.push(2)
s.push(3)
s.push(4)
print('当前栈的元素数:', s.size())
print('出栈...')
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
print("当前栈为%s栈!" % '空' if s.is_empty() else '非空')
print('当前栈的元素数:{0}个'.format(s.size()))
"""
压栈...
当前栈的元素数: 4
出栈...
4
3
2
1
当前栈为空栈!
当前栈的元素数:0个
"""
使用顺序表实现栈的压栈操作最好从尾部开始,使用链表实现栈的压栈操作最好从头部开始,这是由于 时间复杂度
的原因。