栈
概念
栈是一种线性的数据结构,FILO
(先进后出)的操作,可以用顺序表实现,也可以用链表来实现。想象成一个杯子,只能往上面倒水进去,把水倒出去的时候,上面的先出来。
操作
栈的基本操作包含:
- stack():创建空的栈
- push():入栈
- pop():出栈
- peek():返回栈顶元素
- is_empty():判断是否为空栈
- size():返回栈的元素个数
代码实现
通过列表list
的操作来实现栈的先进后出方式
class Stack(object):
"""Stack"""
def __init__(self):
self.__list = []
def push(self, item):
self.__list.append(item)
def pop(self):
return self.__list.pop()
def peek(self):
if self.__list:
return self.__list[-1]
else:
return None
def size(self):
return len(self.__list)
def is_empty(self):
return self.__list == []
if __name__ == "__main__":
s = Stack()
s.push(1)
s.push(2)
s.push(3)
s.push(4)
s.push(5)
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
观察结果:进入的顺序是12345,出来的顺序是54321
image.png
队列
概念
队列queue
也是一种线性结构,方式是先进先出FIFO
, 想象成一支队伍。
- 允许插入数据的一端:队尾
- 允许删除的一端:队头
假设队列,则是队头元素,是队尾元素。删除从开始,添加从开始
操作
几个重要的操作
- enqueue():插入元素
- dequeue():删除元素
- is_empty():判断是否为空
- size():返回元素个数
代码实现
class Queue(object):
def __init__(self):
self.__list = []
def enqueue(self, item):
self.__list.append(item)
def dequeue(self):
return self.__list.pop(0)
def is_empty(self):
return self._list == []
def size(self):
return len(self.__list)
if __name__ == "__main__":
q = Queue()
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
q.enqueue(4)
q.enqueue(5)
print(q.dequeue())
print(q.dequeue())
print(q.dequeue())
print(q.dequeue())
print(q.dequeue())
image.png
双端队列
概念
能够在队头和队尾同时进行插入和删除操作的队列。操作的规则类似栈的先进后出。
代码实现
class Dueue(object):
def __init__(self):
self.__list = []
def add_front(self, item):
self.__list.insert(0, item)
def add_rear(self, 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)
if __name__ == "__main__":
q = Dueue()
q.add_front(1)
q.add_front(2)
q.add_front(3)
q.add_rear(4)
q.add_rear(5)
q.add_rear(6)
print(q.pop_front())
print(q.pop_front())
print(q.pop_front())
print(q.pop_rear())
print(q.pop_rear())
print(q.pop_rear())
image.png