news 2026/5/28 4:54:05

线性数据结构

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
线性数据结构

线性数据结构

1. 技术分析

1.1 线性数据结构概述

线性数据结构按顺序存储数据:

线性结构类型 数组: 连续内存 链表: 分散内存,指针连接 栈: LIFO 队列: FIFO 线性结构特性: 顺序访问 可遍历 可修改

1.2 数组

数组特性 连续内存: 固定大小 随机访问: O(1) 插入删除: O(n) 数组操作: 访问: arr[i] 插入: 需要移动元素 删除: 需要移动元素

1.3 链表

链表特性 分散内存: 动态大小 顺序访问: O(n) 插入删除: O(1) 链表类型: 单链表: 单向指针 双链表: 双向指针 循环链表: 首尾相连

2. 核心功能实现

2.1 动态数组

class DynamicArray: def __init__(self, capacity=10): self.capacity = capacity self.size = 0 self.array = [None] * capacity def _resize(self, new_capacity): new_array = [None] * new_capacity for i in range(self.size): new_array[i] = self.array[i] self.array = new_array self.capacity = new_capacity def append(self, value): if self.size == self.capacity: self._resize(self.capacity * 2) self.array[self.size] = value self.size += 1 def insert(self, index, value): if index < 0 or index > self.size: raise IndexError("Index out of bounds") if self.size == self.capacity: self._resize(self.capacity * 2) for i in range(self.size, index, -1): self.array[i] = self.array[i-1] self.array[index] = value self.size += 1 def remove(self, value): for i in range(self.size): if self.array[i] == value: for j in range(i, self.size-1): self.array[j] = self.array[j+1] self.size -= 1 return True return False def get(self, index): if index < 0 or index >= self.size: raise IndexError("Index out of bounds") return self.array[index] def __getitem__(self, index): return self.get(index) def __len__(self): return self.size def __repr__(self): return str([self.array[i] for i in range(self.size)])

2.2 单链表

class ListNode: def __init__(self, value): self.value = value self.next = None class SinglyLinkedList: def __init__(self): self.head = None self.tail = None self.size = 0 def append(self, value): new_node = ListNode(value) if not self.head: self.head = new_node self.tail = new_node else: self.tail.next = new_node self.tail = new_node self.size += 1 def prepend(self, value): new_node = ListNode(value) if not self.head: self.head = new_node self.tail = new_node else: new_node.next = self.head self.head = new_node self.size += 1 def insert_after(self, prev_node, value): if not prev_node: return new_node = ListNode(value) new_node.next = prev_node.next if prev_node == self.tail: self.tail = new_node prev_node.next = new_node self.size += 1 def delete(self, value): if not self.head: return False if self.head.value == value: self.head = self.head.next if not self.head: self.tail = None self.size -= 1 return True current = self.head while current.next: if current.next.value == value: current.next = current.next.next if not current.next: self.tail = current self.size -= 1 return True current = current.next return False def search(self, value): current = self.head while current: if current.value == value: return current current = current.next return None def __len__(self): return self.size def __repr__(self): values = [] current = self.head while current: values.append(str(current.value)) current = current.next return ' -> '.join(values)

2.3 栈

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() raise IndexError("Pop from empty stack") def peek(self): if not self.is_empty(): return self.items[-1] raise IndexError("Peek from empty stack") def is_empty(self): return len(self.items) == 0 def size(self): return len(self.items) def __len__(self): return self.size() def __repr__(self): return str(self.items)

2.4 队列

class Queue: def __init__(self): self.items = [] def enqueue(self, item): self.items.append(item) def dequeue(self): if not self.is_empty(): return self.items.pop(0) raise IndexError("Dequeue from empty queue") def front(self): if not self.is_empty(): return self.items[0] raise IndexError("Front from empty queue") def is_empty(self): return len(self.items) == 0 def size(self): return len(self.items) def __len__(self): return self.size() def __repr__(self): return str(self.items) class Deque: def __init__(self): self.items = [] def add_front(self, item): self.items.insert(0, item) def add_rear(self, item): self.items.append(item) def remove_front(self): if not self.is_empty(): return self.items.pop(0) raise IndexError("Remove from empty deque") def remove_rear(self): if not self.is_empty(): return self.items.pop() raise IndexError("Remove from empty deque") def is_empty(self): return len(self.items) == 0 def size(self): return len(self.items)

3. 性能对比

3.1 数组vs链表

操作数组链表
随机访问O(1)O(n)
头部插入O(n)O(1)
尾部插入O(1)O(1)
中间插入O(n)O(1)*

3.2 栈vs队列

操作队列
添加O(1)O(1)
删除O(1)O(n)*
访问O(1)O(1)

3.3 实现方式对比

实现优点缺点
数组实现简单扩容开销
链表实现灵活内存开销
双端队列高效复杂

4. 最佳实践

4.1 括号匹配

def is_valid_parentheses(s): stack = Stack() mapping = {')': '(', '}': '{', ']': '['} for char in s: if char in mapping.values(): stack.push(char) elif char in mapping.keys(): if stack.is_empty() or stack.pop() != mapping[char]: return False return stack.is_empty()

4.2 队列应用

def bfs(graph, start): queue = Queue() visited = set() queue.enqueue(start) visited.add(start) while not queue.is_empty(): vertex = queue.dequeue() print(vertex) for neighbor in graph[vertex]: if neighbor not in visited: visited.add(neighbor) queue.enqueue(neighbor)

5. 总结

线性数据结构是基础数据结构:

  1. 数组:随机访问快,插入删除慢
  2. 链表:插入删除快,随机访问慢
  3. :LIFO,后进先出
  4. 队列:FIFO,先进先出

对比数据如下:

  • 数组随机访问最优(O(1))
  • 链表插入删除最优(O(1))
  • 栈适合逆序操作
  • 队列适合顺序处理

选择合适的线性结构可以显著提高程序效率。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 4:54:02

别再乱改壁纸了!用注册表一招锁定Windows桌面,防止熊孩子/同事恶搞

彻底锁定Windows桌面壁纸&#xff1a;注册表高阶管理指南你是否经历过这样的场景&#xff1a;精心设置的办公电脑壁纸被同事"顺手"换成搞笑图片&#xff0c;或是孩子的恶作剧让电脑桌面变成卡通角色大集合&#xff1f;对于IT管理员、公共电脑维护者或是家中有好奇宝宝…

作者头像 李华
网站建设 2026/5/28 4:51:59

结构化调试提示模式:打破调试螺旋,提升AI协作效率

1. 项目概述&#xff1a;当调试陷入死循环&#xff0c;一个提示模式如何成为“破局者”调试&#xff0c;对于任何一位开发者而言&#xff0c;都是职业生涯中无法绕开的“必修课”。我们都有过这样的经历&#xff1a;面对一个看似简单的Bug&#xff0c;你信心满满地开始排查&…

作者头像 李华
网站建设 2026/5/28 4:49:09

AI神话祛魅:从技术原理到数据策略,理性评估与安全使用指南

1. 项目概述&#xff1a;当神话成为营销&#xff0c;我们该如何审视AI的“创新”&#xff1f;最近在圈子里&#xff0c;一个叫“Claude Mythos”的概念被反复提及。乍一听&#xff0c;这名字充满了史诗感和神秘色彩&#xff0c;仿佛某个AI模型已经突破了技术的藩篱&#xff0c;…

作者头像 李华
网站建设 2026/5/28 4:47:00

IndoBERT Large P2 OpenMind社区贡献指南:如何参与项目开发

IndoBERT Large P2 OpenMind社区贡献指南&#xff1a;如何参与项目开发 【免费下载链接】indobert-large-p2-openmind 项目地址: https://ai.gitcode.com/hf_mirrors/jeffding/indobert-large-p2-openmind IndoBERT Large P2 OpenMind 是一个专门为印尼语优化的先进语言…

作者头像 李华