Python 栈、队列的实现

本文介绍如何在Python中使用列表和deque来实现栈和队列的数据结构。详细解释了栈(后进先出)和队列(先进先出)的概念,并展示了具体的代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在python中,列表既可以作为栈使用,又可以作为队列使用。

 

把列表作为栈使用

栈:后进先出

stack=[1,2,3]
stack.append(4)  #入栈,以列表尾部为栈顶
print(stack.pop())  #出栈  4
print(stack)  #[1, 2, 3]

 

 

把列表作为队列使用

队列:先进先出

复制代码

from collections import deque
list=[1,2,3]
queue=deque(list)  #将列表转换为队列
queue.append(0)  #入队,添加到队列尾部
print(queue.popleft())  #出队,弹出并返回队首元素
print(queue)  #deque([2, 3, 0])

#把列表作为队列使用,效率不高,因为出队时要移动后面所有的元素。

复制代码

 

 

deque

deque 是双边队列,同时具有栈和队列的性质,可进行栈、队列相关的操作。并且还在在 list 的基础上增加了移动、旋转和增删等操作。

复制代码

from collections import deque  #需要导入模块
list=[1,2,3]
deque=deque(list)  #将列表转换为deque

deque.append(4)  #添加到尾部
print(deque)  #deque([1, 2, 3, 0])

deque.appendleft(0)  #添加到首部
print(deque)  #deque([0, 1, 2, 3, 4])

print(deque.pop())   #弹出并返回最后一个元素  4
print(deque)  #deque([0, 1, 2, 3])

print(deque.popleft())  #弹出并返回左边第一个元素  0
print(deque)  #deque([1, 2, 3])

复制代码

 

 

deque实现栈:

复制代码

from collections import deque  #需要导入模块
list=[1,2,3]
deque=deque(list)  #将列表转换为deque

#作为栈使用:方式一
deque.append(4)  #入栈
print(deque)  #deque([1, 2, 3, 4])
print(deque.pop())  #出栈  4
print(deque)  #deque([1, 2, 3])

#作为栈使用:方式二
deque.appendleft(0)  #入栈
print(deque)  #deque([0,1, 2, 3])
print(deque.pop())  #出栈  3
print(deque)  #deque([0, 1, 2])

#只要实现后进先出即可

复制代码

 

 

deque实现队列:

复制代码

from collections import deque  #需要导入模块
list=[1,2,3]
deque=deque(list)  #将列表转换为deque

#作为队列使用:方式一
deque.append(4)  #入队
print(deque)  #deque([1, 2, 3, 4])
print(deque.popleft())  #出队  1
print(deque)  #deque([2, 3, 4])

复制代码

 

复制代码

from collections import deque  #需要导入模块
list=[]  #空列表
deque=deque(list)

#作为队列使用:方式二
deque.appendleft(1)  #入队
deque.appendleft(2)  
print(deque)  #deque([2, 1])
print(deque.pop())  #出队  1
print(deque)  #deque([2])

#这种方式需要list是空的

#只要实现先进先出即可

复制代码

 

 

实现栈、队列时,一般是使用空列表[]。

### Python队列和链表的实现 #### 实现 是一种遵循后进先出(LIFO)原则的数据结构。可以通过列表来简单实现的功能。 ```python class Stack: def __init__(self): self.items = [] def push(self, item): """将元素压入""" self.items.append(item) def pop(self): """弹出顶元素""" if not self.is_empty(): return self.items.pop() def is_empty(self): """判断是否为空""" return len(self.items) == 0 def peek(self): """查看顶元素而不移除它""" if not self.is_empty(): return self.items[-1] def size(self): """返回的大小""" return len(self.items) ``` 上述代码展示了如何通过列表实现一个简单的[^1]。 --- #### 队列实现 队列是一种遵循先进先出(FIFO)原则的数据结构。同样可以利用列表或者更高效的方式如`collections.deque`来实现队列。 ```python from collections import deque class Queue: def __init__(self): self.queue = deque() def enqueue(self, item): """将元素加入队列尾部""" self.queue.append(item) def dequeue(self): """从队列头部移除并返回元素""" if not self.is_empty(): return self.queue.popleft() def is_empty(self): """判断队列是否为空""" return len(self.queue) == 0 def front(self): """获取队列的第一个元素""" if not self.is_empty(): return self.queue[0] def size(self): """返回队列的大小""" return len(self.queue) ``` 这里使用了`deque`作为底层容器,因为它的两端操作效率更高[^4]。 --- #### 双向链表的实现 双向链表是由节点组成的一种线性数据结构,其中每个节点不仅包含自身的值还包含前后两个指针分别指向其前驱和后继节点。 ```python class Node: def __init__(self, data=None): self.data = data self.prev = None self.next = None class DoublyLinkedList: def __init__(self): self.head = None def append(self, data): """在链表末尾添加新节点""" new_node = Node(data) if not self.head: self.head = new_node else: current = self.head while current.next: current = current.next current.next = new_node new_node.prev = current def insert_after(self, target_data, data_to_insert): """在目标节点后面插入新节点""" current = self.head while current and current.data != target_data: current = current.next if current: new_node = Node(data_to_insert) new_node.next = current.next new_node.prev = current if current.next: current.next.prev = new_node current.next = new_node def delete(self, node): """删除指定节点""" if node.prev: node.prev.next = node.next if node.next: node.next.prev = node.prev if node == self.head: self.head = node.next node.prev = None node.next = None def traverse(self): """遍历链表并打印所有节点的值""" result = [] current = self.head while current: result.append(current.data) current = current.next return result ``` 这段代码定义了一个完整的双向链表类及其核心方法,包括新增、删除以及遍历等功能[^2][^3]。 --- #### 总结 以上实现了三种常见的数据结构——队列和双向链表,在实际应用中可以根据需求选择合适的方式来优化性能或简化逻辑处理过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值