1.栈
特性:先进后出的数据结构
栈顶,栈尾
- Stack() 创建一个空的新栈。 它不需要参数,并返回一个空栈。
- push(item)将一个新项添加到栈的顶部。它需要 item 做参数并不返回任何内容。
- pop() 从栈中删除顶部项。它不需要参数并返回 item 。栈被修改。
- peek() 从栈返回顶部项,但不会删除它。不需要参数。 不修改栈。
- isEmpty() 测试栈是否为空。不需要参数,并返回布尔值。
- size() 返回栈中的 item 数量。不需要参数,并返回一个整数。
1 class Stack(): 2 def __init__(self): 3 self.items = [] 4 def push(self,item): 5 self.items.append(item) 6 def pop(self): 7 if self.isEmpty(): 8 return None 9 else: 10 return self.items.pop() 11 def isEmpty(self): 12 #空=》True 13 return self.items == [] 14 def peek(self): 15 return self.items[len(self.items) - 1] 16 def size(self): 17 return len(self.items)
2.队列
特性:先进先出
- Queue() 创建一个空的新队列。 它不需要参数,并返回一个空队列。
- enqueue(item) 将新项添加到队尾。 它需要 item 作为参数,并不返回任何内容。
- dequeue() 从队首移除项。它不需要参数并返回 item。 队列被修改。
- isEmpty() 查看队列是否为空。它不需要参数,并返回布尔值。
size() 返回队列中的项数。它不需要参数,并返回一个整数。
1 class Queue(): 2 def __init__(self): 3 self.items = [] 4 def enqueue(self,item): 5 self.items.insert(0,item) 6 def isEmpty(self): 7 return self.items == [] 8 def dequeue(self): 9 if self.isEmpty(): 10 return None 11 else: 12 return self.items.pop() 13 def size(self): 14 return len(self.items) 15 def travel(self): 16 print(self.items)
3.顺序表
- 集合中存储的元素是有顺序的,顺序表的结构可以分为两种形式:单数据类型和多数据类型。
- python中的列表和元组就属于多数据类型的顺序表
- 单数据类型顺序表的内存图(内存连续开启)
- 对应的内存空间是连续开辟的
- 顺序表的变量/引用存的的(指向的)是内存空间的首地址
-
多数据类型顺序表的内存图(内存非连续开辟)
重点:
- 想把数据存储到内存中,必须先在内存中开辟指定大小的内存空间(大小,地址:定位)
- 如果一个引用指向了某一块内存空间,则表示该引用存储了该内存空间的地址
- 顺序表的弊端:顺序表的结构需要预先知道数据大小来申请连续的存储空间,而在进行扩充时 又需要进行数据的搬迁。
4.链表
特性:
相对于顺序表,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理且进行扩充时不需要进行数据搬迁。
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是每一个结点(数据存储单元)里存放下一个结点的信息(即地址)
- is_empty():链表是否为空
- length():链表长度
- travel():遍历整个链表
- add(item):链表头部添加元素
- append(item):链表尾部添加元素
- insert(pos, item):指定位置添加元素
- remove(item):删除节点
search(item):查找节点是否存在
1 #封装节点数据结构 2 class Node(): 3 def __init__(self,item): 4 self.item = item 5 self.next = None 6 def __str__(self): 7 return self.item 8 #封装链表数据结构 9 class Link(): 10 #初始化一个空链表 11 def __init__(self): 12 #该属性永远指向第一个节点 13 self._head = None 14 def isEmpty(self): 15 return self._head == None 16 def add(self,item): 17 #创建一个新的节点对象 18 node = Node(item) 19 #将节点插入到链表的头部 20 node.next = self._head 21 self._head = node 22 def travel(self): 23 cur = self._head 24 while cur: 25 print(cur.item) 26 cur = cur.next 27 def length(self): 28 count = 0 29 cur = self._head 30 while cur: 31 count += 1 32 cur = cur.next 33 return count 34 def append(self,item): 35 cur = self._head 36 pre = None #cur前面节点的地址 37 38 node = Node(item) 39 #如果链表为空则新节点作为链表中的第一个节点 40 if self._head is None: 41 self._head = node 42 return 43 #链表非空对应的插入情况 44 while cur: 45 pre = cur 46 cur = cur.next 47 pre.next = node 48 49 def insert(self,pos,item): 50 cur = self._head 51 pre = None 52 node = Node(item) 53 length = self.length() 54 #对特殊情况的处理 55 if pos > length: 56 self.append(item) 57 return 58 if pos <= 0: 59 self.add(item) 60 return 61 #正常处理 62 for i in range(pos): 63 pre = cur 64 cur = cur.next 65 pre.next = node 66 node.next = cur 67 def remove(self,item): 68 cur = self._head 69 pre = None 70 #如果删除的是第一个节点 71 if item == cur.item: 72 self._head = cur.next 73 return 74 while cur: 75 if cur.item == item: 76 pre.next = cur.next 77 return 78 else: 79 pre = cur 80 cur = cur.next 81 82 83 def search(self,item): 84 find = False 85 cur = self._head 86 while cur: 87 if cur.item == item: 88 find = True 89 break 90 cur = cur.next 91 return find
5.二叉树
构成:根节点,左叶子结点,右叶子结点,子树
广度遍历:层级
深度遍历:前序(跟左右),中序(左根右),后序(左右根)
1 class Node(): 2 def __init__(self,item): 3 self.item = item 4 self.left = None 5 self.right = None 6 class Tree(): 7 def __init__(self): 8 self.root = None 9 def add(self,item): 10 node = Node(item) 11 12 if self.root is None: 13 self.root = node 14 return 15 queue = [self.root] 16 while queue: 17 cur = queue.pop(0) 18 if cur.left is None: 19 cur.left = node 20 return 21 else: 22 queue.append(cur.left) 23 if cur.right is None: 24 cur.right = node 25 return 26 else: 27 queue.append(cur.right) 28 def travel(self): 29 if self.root is None: 30 return 31 queue = [self.root] 32 33 while queue: 34 cur = queue.pop(0) 35 print(cur.item) 36 if cur.left is not None: 37 queue.append(cur.left) 38 if cur.right is not None: 39 queue.append(cur.right) 40
排序二叉树
1 class Node(): 2 def __init__(self,item): 3 self.item = item 4 self.left = None 5 self.right = None 6 class Tree(): 7 def __init__(self): 8 self.root = None 9 10 def insertByOder(self,item): 11 12 node = Node(item) 13 if self.root is None: 14 self.root = node 15 return 16 17 cur = self.root 18 while True: 19 if item < cur.item: 20 if cur.left is None: 21 cur.left = node 22 return 23 else: 24 cur = cur.left 25 else: 26 if cur.right is None: 27 cur.right = node 28 return 29 else: 30 cur = cur.right 31 32 def forward(self,root): 33 if root is None: 34 return 35 # 根 左 右 36 print(root.item,end=' ') 37 self.forward(root.left) 38 self.forward(root.right) 39 def mid(self,root): 40 if root is None: 41 return 42 #左根右 43 self.mid(root.left) 44 print(root.item,end=' ') 45 self.mid(root.right) 46 def back(self,root): 47 if root is None: 48 return 49 #左右根 50 self.back(root.left) 51 self.back(root.right) 52 print(root.item,end=' ') 53