常见的8种数据结构

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 常见的数据结构包括数组、链表、队列、栈、树、堆、哈希表和图。

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

常见数据结构

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个有序链表问题。

目录
打赏
0
2
4
0
395
分享
相关文章
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
255 9
聊聊从单体到微服务架构服务演化过程
本文介绍了从单体应用到微服务再到云原生架构的演进过程。单体应用虽易于搭建和部署,但难以局部更新;面向服务架构(SOA)通过模块化和服务总线提升了组件复用性和分布式部署能力;微服务则进一步实现了服务的独立开发与部署,提高了灵活性;云原生架构则利用容器化、微服务和自动化工具,实现了应用在动态环境中的弹性扩展与高效管理。这一演进体现了软件架构向着更灵活、更高效的方向发展。
存储过程的创建和调用
存储过程的创建和调用
152 10
Polars库:数据分析的新星,性能与易用性的完美结合
Polars库:数据分析的新星,性能与易用性的完美结合
394 1
React DnD:实现拖拽功能的终极方案?
本文首发于微信公众号“前端徐徐”,介绍了一个强大的 React 拖拽库——React DnD。React DnD 帮助开发者轻松创建复杂的拖拽界面,适用于 Trello 风格的应用、列表重排序、可拖拽的 UI 组件等场景。文章详细介绍了 React DnD 的基本信息、主要特点、使用场景及快速上手指南。
763 3
React DnD:实现拖拽功能的终极方案?
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
1021 1
|
9月前
|
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
209 2
最佳实践:AnalyticDB在企业级大数据分析中的应用案例
【10月更文挑战第22天】在数字化转型的大潮中,企业对数据的依赖程度越来越高。如何高效地处理和分析海量数据,从中提取有价值的洞察,成为企业竞争力的关键。作为阿里云推出的一款实时OLAP数据库服务,AnalyticDB(ADB)凭借其强大的数据处理能力和亚秒级的查询响应时间,已经在多个行业和业务场景中得到了广泛应用。本文将从个人的角度出发,分享多个成功案例,展示AnalyticDB如何助力企业在广告投放效果分析、用户行为追踪、财务报表生成等领域实现高效的数据处理与洞察发现。
805 0
Spring事务中的@Transactional注解剖析
通过上述分析,可以看到 `@Transactional`注解在Spring框架中扮演着关键角色,它简化了事务管理的复杂度,让开发者能够更加专注于业务逻辑本身。合理运用并理解其背后的机制,对于构建稳定、高效的Java企业应用至关重要。
229 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问