栈,就一个口,后进先出(LIFO),链表
队列,先进先出(FIFO),树
栈的操作:
1.创建一个新的空栈
2.添加一个新的元素到栈顶
3.弹出栈顶元素,出栈
4.返回栈顶元素
5.判断是否为空
6.返还元素个数
class Stack(object):
"""栈,存放栈可以用链表,也可以用顺序表,这里用顺序表"""
def __init__(self):
"""
私有变量外界不能访问,比如stack = Stack(),print(stack.__list)会报错
私有变量的设置是不希望外人能修改,这里就是不希望外人直接随意修改栈本身,
而是要通过定义的操作
"""
self.__list =[]
def push(self, item):
"""添加一个新的元素item到栈顶"""
# 这里为什么选择在列表的尾部插入,而不是在头部插入
# 尾部插入出栈也可以pop,在头部插入也可以出栈
# 原因在于,对于列表,在尾部插入计算复杂度是O(1)
# 而头部插入是O(n)
self.__list.append(item)
# self.__list.insert(0, item) # 头部插入
def pop(self):
"""弹出栈顶元素"""
return self.__list.pop()
# self.__list.pop(0) # 头部插入对应的出栈操作
def peek(self):
"""返回栈顶元素"""
if self.__list:
return self.__list[-1] #空列表不支持-1操作
else:
return None
def is_empty(self):
"""判断栈是否为空"""
# return self.__list # 如果这么写,is_empty就直接拿到列表了
return self.__list == []
def size(self):
"""返回栈的元素个数"""
return len(self.__list)
if __name__== "__main__":
s = Stack()
s.push(1)
s.push(2)
print(s.pop())
队列:
1.创建一个新的空队列
2.添加一个新的元素到队列
3.出队
4.判断是否为空
class Queue(object):
def __init__(self):
"""这里还是使用顺序表"""
self.__list = []
def enqueue(self, item):
"""往队列中添加一个item元素"""
self.__list.append(item)
# self.__list.insert(0, item)
# 队列的进队出队不管哪种方式都会一个O(1),一个O(n)
# 选择时要根据队列常用的操作来决定到底是头插还是尾插
def dequeue(self, item):
"""从队列头部删除一个元素"""
return self.__list.pop(0)
# return self.pop()
def is_empty(self):
"""从队列头部删除一个元素"""
return self.__list == []
def size(self):
"""从队列头部删除一个元素"""
return len(self.__list)
双端队列:
1.建立队列
2.在头部添加
3.在尾部添加
4.头部删除
5.尾部删除
class Deque(object):
def __init__(self):
"""这里还是使用顺序表"""
self.__list = []
def add_front(self, item):
"""往队列头部添加一个item元素"""
self.__list.insert(0, item)
def add_rear(self, item):
"""往队列尾部添加一个item元素"""
self.__list.append(item)
def pop_front(self):
"""从队列头部删除一个元素"""
return self.__list.pop(0)
def pop_rear(self):
"""从队列头部删除一个元素"""
return self.__list.pop()
def is_empty(self):
"""从队列头部删除一个元素"""
return self.__list == []
def size(self):
"""从队列头部删除一个元素"""
return len(self.__list)