常见的8种数据结构

简介: 常见的数据结构包括数组、链表、队列、栈、树、堆、哈希表和图。

常见的数据结构包括数组、链表、队列、栈、树、堆、哈希表和图,每种数据结构都有其特点,如下:

常见数据结构

1.数组

2.链表

3.队列

4.栈

5.树

6.图

7.哈希表

8.堆


1.数组

特点:

固定大小的线性数据结构

支持快速随机访问

插入和删除效率比较低

一般应用于需要快速随机访问元素的场景。

案例:

# 定义一个数组

arr = [1, 2 , 3, 4, 5]

# 访问数组元素

print(arr[2])  # 输出: 3

# 修改数组元素

arr[2] = 10

print(arr)  # 输出: [1, 2, 10, 4, 5]

# 添加元素

arr.append(6)

print(arr)  # 输出: [1, 2, 10, 4, 5, 6]

# 删除元素

arr.pop(2)

print(arr)  # 输出: [1, 2, 4, 5, 6]


2.链表

特点:

动态大小的数据结构

插入和删除效率比较高

不支持快速随机访问

适用于需要频繁插入和删除元素的场景

案例:

class Node:

   def __init__(self, data=None):

       self.data = data

       self.next = None

class LinkedList:

   def __init__(self):

       self.head = None

   def append(self, data):

       new_node = Node(data)

       if not self.head:

           self.head = new_node

           return

       last = self.head

       while last.next:

           last = last.next

       last.next = new_node

   def print_list(self):

       curr = self.head

       while curr:

           print(curr.data, end=" -> ")

           curr = curr.next

       print("None")

# 使用链表

llist = LinkedList()

llist.append(1)

llist.append(2)

llist.append(3)

llist.print_list()  # 输出: 1 -> 2 -> 3 -> None


3.队列

特点:

先进先出

插入操作在队尾进行,删除操作在队头进行

应用于需要先进先出访问元素的场景,如任务调度、消息队列等

案例:

from collections import deque

# 使用 deque 实现队列

queue = deque()

# 入队

queue.append(1)

queue.append(2)

queue.append(3)

print(queue)  # 输出: deque([1, 2, 3])

# 出队

print(queue.popleft())  # 输出: 1

print(queue)  # 输出: deque([2, 3])


4.栈

特点:

先进后出

插入和删除在栈顶进行

应用于需要后进先出访问元素的场景,如函数调用栈、表达式求值等

案例:

# 使用列表实现栈

stack = []

# 入栈

stack.append(1)

stack.append(2)

stack.append(3)

print(stack)  # 输出: [1, 2, 3]

# 出栈

print(stack.pop())  # 输出: 3

print(stack)  # 输出: [1, 2]


5.树

特点:

非线性,由节点和边组成

树中的节点有层次关系,一个节点可以有多个子节点

应用于需要表示层次结构的场景,比如文件系统、组织结构等

案例:

class TreeNode:

   def __init__(self, data):

       self.data = data

       self.children = []

   def add_child(self, child_node):

       self.children.append(child_node)

   def print_tree(self, level=0):

       prefix = " " * (level * 4)

       print(prefix + self.data)

       for child in self.children:

           child.print_tree(level + 1)

# 创建树

root = TreeNode("Root")

child1 = TreeNode("Child1")

child2 = TreeNode("Child2")

child3 = TreeNode("Child3")

root.add_child(child1)

root.add_child(child2)

child1.add_child(TreeNode("Grandchild1"))

child1.add_child(TreeNode("Grandchild2"))

root.print_tree()


6.图

特点:

非线性,由节点和边组成

图中的节点可以通过边来相互连接

应用于需要表示网络结构的场景,如社交网络、交通网络等。

案例:

class Graph:

   def __init__(self):

       self.graph = {}

   def add_edge(self, u, v):

       if u not in self.graph:

           self.graph[u] = []

       self.graph[u].append(v)

   def print_graph(self):

       for node in self.graph:

           print(f"{node} -> {', '.join(self.graph[node])}")

# 创建图

g = Graph()

g.add_edge("A", "B")

g.add_edge("A", "C")

g.add_edge("B", "D")

g.add_edge("C", "D")

g.print_graph()


7.哈希表

特点:

基于哈希函数实现的键值对数据结构

支持快速的插入、删除和查找操作

应用于需要快速查找和插入操作的场景,如字典、缓存等。

案例:

# 使用字典实现哈希表

hash_table = {}

# 插入键值对

hash_table["name"] = "John"

hash_table["age"] = 30

hash_table["city"] = "New York"

print(hash_table)  # 输出: {'name': 'John', 'age': 30, 'city': 'New York'}

# 查找键值对

print(hash_table["name"])  # 输出: John

# 删除键值对

del hash_table["age"]

print(hash_table)  # 输出: {'name': 'John', 'city': 'New York'}


8.堆

特点:

堆是一颗完全二叉树

分为最大堆和最小堆

最大堆:每个节点的值都大于或等于其子节点的值。

最小堆:每个节点的值都小于或等于其子节点的值。

支持快速获取最大值或最小值的操作。

适用于优先队列,堆排序和实现高效的合并K个有序链表问题。

相关文章
|
存储 索引
数据结构(顺序结构、链式结构、索引结构、散列结构)
数据结构(顺序结构、链式结构、索引结构、散列结构)
|
消息中间件 安全 Kafka
一文搞懂Kafka中的listeners配置策略
1. listeners中的plaintext controller external是什么意思? 2. Kraft模式下controller和broker有何区别? 3. 集群节点之间同步什么数据,通过哪个端口,是否可以自定义端口? 4. 客户端通过哪个端口连接到kafka,通过9092连接的是什么,broker还是controller? 5. 为controller配置了单独的端口有什么用? 6. control.plane.listener.name与controller.listener.names有何区别?
3202 2
|
8月前
|
NoSQL Java 关系型数据库
Java 从入门到进阶完整学习路线图规划与实战开发最佳实践指南
本文为Java开发者提供从入门到进阶的完整学习路线图,涵盖基础语法、面向对象、数据结构与算法、并发编程、JVM调优、主流框架(如Spring Boot)、数据库操作(MySQL、Redis)、微服务架构及云原生开发等内容,并结合实战案例与最佳实践,助力高效掌握Java核心技术。
876 1
|
存储 人工智能 开发者
三文带你轻松上手鸿蒙的AI语音02-声音文件转文本
三文带你轻松上手鸿蒙的AI语音02-声音文件转文本
500 0
三文带你轻松上手鸿蒙的AI语音02-声音文件转文本
|
缓存 小程序 API
微信小程序页面导航与路由:实现多页面跳转与数据传递
本文深入探讨微信小程序的页面导航与路由机制,介绍多种页面跳转方式如`wx.navigateTo`、`wx.redirectTo`、`wx.switchTab`等,并讲解通过URL、全局变量和事件传递数据的方法。结合案例实现多页面跳转与数据传递,帮助开发者掌握这一重要技能。
|
网络协议
UDP协议在网络通信中的独特应用与优势
UDP(用户数据报协议)作为关键的传输层协议,在网络通信中展现出独特优势。本文探讨UDP的无连接性及低开销特性,使其在实时性要求高的场景如视频流、在线游戏中表现优异;其不保证可靠交付的特性赋予应用程序自定义传输策略的灵活性;面向报文的高效处理能力及短小的包头设计进一步提升了数据传输效率。总之,UDP适用于高速、实时性强且对可靠性要求不高的应用场景,为网络通信提供了多样化的选择。
|
SQL 存储 关系型数据库
【赵渝强老师】Hive的内部表与外部表
Hive是基于HDFS的数据仓库,支持SQL查询。其数据模型包括内部表、外部表、分区表、临时表和桶表。本文介绍了如何创建和使用内部表和外部表,提供了详细的步骤和示例代码,并附有视频讲解。
987 1
|
前端开发
content-box和border-box是什么?
content-box和border-box是什么?
878 0
|
存储 机器学习/深度学习 并行计算
95% 的算法都是基于这 6 种算法思想 (详细介绍)
95% 的算法都是基于这 6 种算法思想 (详细介绍)
619 4
|
文件存储
一篇文章讲明白LTE中的各种ID含义
一篇文章讲明白LTE中的各种ID含义
1282 0