Python --- 线性表、栈、队列、树

本文深入探讨Python中数据结构的基础,包括线性表的基本操作,栈的先进后出特性,队列的先进先出原则以及二叉树的构造和遍历方法。通过实例代码解析,帮助读者理解并掌握这些基本数据结构的使用。
"""
线性表的定义分类:
    一、定义:具有零个或多个数据元素的有限序列
    二、特征:第一个元素没有前驱元素   最后一个元素没有后继元素  其它的元素只有一个前驱元素和一个后继元素
    三、操作:插入  删除  查找
    四、分类:
        1、顺序表:存储结构连续   
            定义:在计算机的内存中 以一组地址连续的存储单元 依次存储数据元素的线性结构
            优缺点:
                优点:支持随机访问
                缺点:插入删除需要移动大量元素  造成存储空间碎片
            在python中的应用:列表/元组
            时间复杂度:访问 O(1)   插入删除O(n)
        2、链表:逻辑连续  存储结构不连续
            定义:常见的数据结构 是一种线性表
            分类:单向链表、单向循环链表、双向链表
            优缺点:
                优点:插入删除方便
                缺点:不支持随机访问
            时间复杂度:访问O(n)    插入删除O(n)



栈:
    栈的定义:只允许在表尾进行插入删除的线性表  
    特征:后进先出
    
Stack() 创建一个新的空栈
push(item) 添加一个新的元素item到栈顶
pop() 弹出栈顶元素
peek() 返回栈顶元素
is_empty() 判断栈是否为空
size() 返回栈的元素个数



队列:
    只允许在一端插入另一端删除的先进先出的线性表
    
	Queue() 创建一个空的队列  alist = []
	enqueue(item) 往队列中添加一个item元素  alist.append()
	dequeue() 从队列头部删除一个元素  alist.pop(0)
	is_empty() 判断一个队列是否为空
	size() 返回队列的大小



树:
    节点的度:一个节点含有子树的个数 称为该节点的度
    树的度:最大节点的度 就是树的度
    叶节点/终端节点:度为零的节点
    父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点
    子节点:一个节点含有的子树的节点称为该节点的子节点
    兄弟节点:具有相同父节点的节点互称为兄弟节点
    节点的层次:从根开始定义起 根为第1层 根的子节点为第2层 以此类推
    树的高度或深度:树中节点的最大层次
    堂兄弟节点:父节点在同一层的节点互为堂兄弟
    节点的祖先:从根到该节点所经分支上的所有节点
    子孙:以某节点为根的子树中任一节点都称为该节点的子孙
    森林:由m(m>0)棵互不相交的树的集合称为森林
    
    树的分类:
        有序树:
        无序树:
        二叉树***:
            完全二叉树:
            平衡二叉树:
            排序二叉树:
        霍夫曼树:
        B树:
    树的存储:
        顺序存储:
        链式存储:二叉树存储方式
    树的应用:
        路由协议 、 mysql数据库索引 、 文件系统的目录结构 、 AI算法 、 xml/html
    二叉树:
        完全二叉树:
        满二叉树:除了叶节点 其它的节点都有左右子树
    遍历:
        深度优先遍历:
            先序:根节点  左子树  右子树
            A - B - D - H - I - E - J - C - F - G
            中序:左子树  根节点  右子树
            H - D - I - B - J - E - A - F - C - G
            后序:左子树  右子树  根节点
            H - I - D - J - E - B - F - G - C - A
        广度优先遍历: - - - - - 层次遍历
            从上到下、从左到右  依次遍历
"""
### 线性表队列相关的数据结构知识及算法题 #### 1. 线性表基础知识 线性表是一种基本的数据结构,其元素之间具有一对一的线性关系。线性表可以分为顺序表和链表两种存储方式[^2]。 - **顺序表**:通过数组实现,支持随机访问,插入和删除操作效率较低。 - **链表**:通过指针连接节点实现,不支持随机访问,但插入和删除操作效率较高。 ```python # 顺序表实现 class SeqList: def __init__(self, size): self.data = [None] * size self.length = 0 def insert(self, index, value): if self.length == len(self.data): return False for i in range(self.length, index, -1): self.data[i] = self.data[i - 1] self.data[index] = value self.length += 1 return True ``` #### 2. 的基本概念与实现 是一种后进先出(LIFO)的数据结构,支持两种基本操作:入(push)和出(pop)。可以通过数组或链表实现[^1]。 ```python # 的数组实现 class Stack: def __init__(self, capacity): self.arr = [0] * capacity self.top = -1 self.capacity = capacity def push(self, value): if self.top == self.capacity - 1: return False self.top += 1 self.arr[self.top] = value return True def pop(self): if self.top == -1: return None value = self.arr[self.top] self.top -= 1 return value ``` #### 3. 队列的基本概念与实现 队列是一种先进先出(FIFO)的数据结构,支持两种基本操作:入队(enqueue)和出队(dequeue)。队列可以通过数组或链表实现,循环队列是常见的优化形式[^4]。 ```python # 循环队列的数组实现 class Queue: def __init__(self, capacity): self.front = 0 self.rear = 0 self.capacity = capacity self.queue = [None] * capacity def enqueue(self, value): if (self.rear + 1) % self.capacity == self.front: return False self.queue[self.rear] = value self.rear = (self.rear + 1) % self.capacity return True def dequeue(self): if self.front == self.rear: return None value = self.queue[self.front] self.front = (self.front + 1) % self.capacity return value ``` #### 4. 队列的算法题 ##### 4.1 有效的括号 给定一个只包含 `'('` 和 `')'` 的字符串,判断括号是否有效。 ```python def is_valid_parentheses(s): stack = [] for char in s: if char == '(': stack.append(char) elif char == ')': if not stack: return False stack.pop() return not stack ``` ##### 4.2 用队列实现 使用队列实现的 `push` 和 `pop` 操作。 ```python class MyStack: def __init__(self): self.queue1 = [] self.queue2 = [] def push(self, x): self.queue1.append(x) def pop(self): while len(self.queue1) > 1: self.queue2.append(self.queue1.pop(0)) result = self.queue1.pop(0) self.queue1, self.queue2 = self.queue2, self.queue1 return result ``` ##### 4.3 用实现队列 使用实现队列的 `enqueue` 和 `dequeue` 操作。 ```python class MyQueue: def __init__(self): self.stack1 = [] self.stack2 = [] def enqueue(self, x): self.stack1.append(x) def dequeue(self): if not self.stack2: while self.stack1: self.stack2.append(self.stack1.pop()) return self.stack2.pop() if self.stack2 else None ``` ##### 4.4 设计循环队列 设计一个支持所有队列操作的循环队列。 ```python class CircularQueue: def __init__(self, capacity): self.queue = [None] * capacity self.head = 0 self.tail = 0 self.size = 0 self.capacity = capacity def enqueue(self, value): if self.size == self.capacity: return False self.queue[self.tail] = value self.tail = (self.tail + 1) % self.capacity self.size += 1 return True def dequeue(self): if self.size == 0: return None value = self.queue[self.head] self.head = (self.head + 1) % self.capacity self.size -= 1 return value ``` ####
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值