常见的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有何区别?
2905 2
|
Rust 数据挖掘 数据处理
Polars库:数据分析的新星,性能与易用性的完美结合
Polars库:数据分析的新星,性能与易用性的完美结合
756 1
|
存储 人工智能 开发者
三文带你轻松上手鸿蒙的AI语音02-声音文件转文本
三文带你轻松上手鸿蒙的AI语音02-声音文件转文本
411 0
三文带你轻松上手鸿蒙的AI语音02-声音文件转文本
|
10月前
|
缓存 小程序 API
微信小程序页面导航与路由:实现多页面跳转与数据传递
本文深入探讨微信小程序的页面导航与路由机制,介绍多种页面跳转方式如`wx.navigateTo`、`wx.redirectTo`、`wx.switchTab`等,并讲解通过URL、全局变量和事件传递数据的方法。结合案例实现多页面跳转与数据传递,帮助开发者掌握这一重要技能。
|
网络协议
UDP协议在网络通信中的独特应用与优势
UDP(用户数据报协议)作为关键的传输层协议,在网络通信中展现出独特优势。本文探讨UDP的无连接性及低开销特性,使其在实时性要求高的场景如视频流、在线游戏中表现优异;其不保证可靠交付的特性赋予应用程序自定义传输策略的灵活性;面向报文的高效处理能力及短小的包头设计进一步提升了数据传输效率。总之,UDP适用于高速、实时性强且对可靠性要求不高的应用场景,为网络通信提供了多样化的选择。
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
1162 1
|
数据采集 分布式计算 OLAP
最佳实践:AnalyticDB在企业级大数据分析中的应用案例
【10月更文挑战第22天】在数字化转型的大潮中,企业对数据的依赖程度越来越高。如何高效地处理和分析海量数据,从中提取有价值的洞察,成为企业竞争力的关键。作为阿里云推出的一款实时OLAP数据库服务,AnalyticDB(ADB)凭借其强大的数据处理能力和亚秒级的查询响应时间,已经在多个行业和业务场景中得到了广泛应用。本文将从个人的角度出发,分享多个成功案例,展示AnalyticDB如何助力企业在广告投放效果分析、用户行为追踪、财务报表生成等领域实现高效的数据处理与洞察发现。
1087 0
|
前端开发
content-box和border-box是什么?
content-box和border-box是什么?
632 0
|
存储 机器学习/深度学习 并行计算
95% 的算法都是基于这 6 种算法思想 (详细介绍)
95% 的算法都是基于这 6 种算法思想 (详细介绍)
501 4
|
机器学习/深度学习 传感器 人工智能
敢不敢和AI比猜拳?能赢算我输----基于手势识别的AI猜拳游戏【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目
敢不敢和AI比猜拳?能赢算我输----基于手势识别的AI猜拳游戏【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目