栈、队列、链表(总结)

队列

队列可以看做是高速路口,进出口需要车辆排成一列,这就是线性结构,在车队中的车只能在入口选择是上高速还是原路返回,简单定义是一种特殊的线性结构,只能在head出做处理。

我认为栈的结构很有趣,拿一个高中数学题来说,三根柱子上套着不同大小的轮盘,要将他们按大小排在一根柱子上,这是一个数列题,但是我们同样可以用算法解决,这时候柱子想相当于一个栈。栈就像一根柱子套上不同大小,或者有编号的轮盘用来标志他们,每次操作都要按照顺序,例如要想取下最里面的轮盘就要一次从外到里一次去下所有轮盘。

链表

这就是建立一个一维线性结构,但要用一些方法将他们各个元素连接起来,我这里有两种方法——指针、模拟链表。

指针

语言基础里应该都会学,指针链接链表的方法是建立一个结构体,这个结构体包含两个部分一个用来储存数据,一个用来指向下一个结构体。我们可以想象一下链条,每根链条的每个单元都是一个固体然后又存在一个与后面相连的结构。指针的优势在于,一对数列中要按顺序插入一个数,这样只需将两个指针改变,不需要移动很多的数据。

模拟链表

它的方式是两个一维数组,表示一个一维结构,第一个date数组存数据,第二个right数组链接数据这种方式很好理解,和指针的作用相似。

### 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]。 --- #### 总结 以上实现了三种常见的数据结构——队列和双向链表,在实际应用中可以根据需求选择合适的方式来优化性能或简化逻辑处理过程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值