Python实现栈、队列和双端队列
程序员文章站
2024-03-18 12:25:58
...
栈
栈(stack)是一种容器,它的特点在于只允许在容器的一端(称为栈顶指标,即top)进行加入数据(push)和输出数据(pop)的运算,即按照后进先出(LIFO,Last In First Out)的原理运作。
栈可以用顺序表实现,也可以用链表实现。顺序表或链表决定了数据如何存放,栈决定了数据如何操作。
Python中的列表(List)就相当于顺序表,现在我们采用List来实现栈。
我们需要实现的栈包含以下几种操作:
- Stack() 创建一个新的空栈
- push(elem) 添加一个新的元素elem到栈顶
- pop() 弹出栈顶元素
- peek() 返回栈顶元素
- is_empty() 判断栈是否为空
- size() 返回栈的元素个数
下面直接看代码实现:
class Stack(object):
"""栈"""
def __init__(self):
self.__list = []
def push(self, elem):
"""添加一个新元素elem到栈顶"""
self.__list.append(elem)
def pop(self):
"""弹出栈顶元素"""
if self.is_empty():
return None
else:
return self.__list.pop()
def peek(self):
"""返回栈顶元素"""
if self.__list:
return self.__list[-1]
else:
return None
def is_empty(self):
"""判断栈是否为空"""
return [] == self.__list
def size(self):
"""返回栈的元素个数"""
return len(self.__list)
if __name__ == '__main__':
s = Stack()
s.push(1)
s.push(2)
s.push(3)
s.push(4)
print(s.pop()) # 4
print(s.pop()) # 3
print(s.pop()) # 2
print(s.pop()) # 1
队列
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出的(FIFO,First In First Out)的线性表,允许插入的一端为队尾,允许删除的一端为队头。队列数据结构的操作和我们平时排队是一致的,排在队头的先出列完成事务,新来的人只能排在队尾。
队列的常用操作为:
- Queue() 创建一个空的队列
- enqueue(elem) 往队列中添加一个elem元素
- dequeue() 从队列头部删除一个元素
- is_empty() 判断一个队列是否为空
- size() 返回队列的大小
代码实现为:
class Queue(object):
def __init__(self):
"""创建一个空的队列"""
self.__list = []
def enqueue(self, elem):
"""往队列中添加一个item元素"""
self.__list.append(elem)
def dequeue(self):
"""从队列头部删除一个元素"""
if self.is_empty():
return None
else:
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)
print(q.dequeue())
print(q.dequeue())
print(q.dequeue())
print(q.dequeue())
双端队列
双端队列(deque,全名double-ended queue),是一种同时具有队列和栈的性质的数据结构。
双端队列中的元素可以从两端插入和删除。
双端队列的常用操作为:
- Deque() 创建一个空的双端队列
- add_front(elem) 从队头加入一个elem元素
- add_rear(elem) 从队尾加入一个elem元素
- pop_front() 从队头删除一个elem元素
- pop_rear() 从队尾删除一个elem元素
- is_empty() 判断双端队列是否为空
- size() 返回双端队列的大小
代码实现:
class Deque(object):
"""双端队列"""
def __init__(self):
"""创建一个空的队列"""
self.__list = []
def add_front(self, elem):
"""往双端对列头部添加一个elem元素"""
self.__list.insert(0, elem)
def add_rear(self, elem):
"""往双端队列尾部添加一个elem元素"""
self.__list.append(elem)
def pop_front(self):
"""从双端队列头部取出一个元素"""
if self.is_empty():
return None
else:
return self.__list.pop(0)
def pop_rear(self):
"""从双端对列尾部取出一个元素"""
if self.is_empty():
return None
else:
return self.__list.pop()
def is_empty(self):
"""判断一个队列是否为空"""
return [] == self.__list
def size(self):
"""返回队列的大小"""
return len(self.__list)
if __name__ == '__main__':
dq = Deque()
dq.add_front(1)
dq.add_front(2)
dq.add_rear(3)
dq.add_rear(4)
print(dq.pop_rear())
print(dq.pop_front())