内容:
1.数组
2.链表
3.字典
4.二叉树(搜索树)
5.set集合实现
1.数组
数组在python中是以列表的形式存在,基本上每一个语言中都有数组形式的数据结构存在
数组一般存储在连续的一块内存,数组存取元素时间是 O(1),插入、删除是 O(n),另外可以用数组实现栈和队列,栈:先进后出,队列:先进先出
另外python list中有两个部件:
- 数组 存储数据在链表中的地址
- 链表 实际存储数据
列表:
1 lt = [1, 2, 3, 4, 5, 5] 2 3 # 存取 4 print(lt[0]) 5 lt[1] = 666 6 print(lt) 7 8 # 插入元素 9 lt.insert(0, 333) 10 print(lt) 11 12 # 删除元素 13 # 按值删除: 14 lt.remove(5) 15 print(lt) 16 # 按索引删除: 17 lt.pop(0) 18 print(lt) 19 del lt[0] 20 print(lt)
用python中的list相关操作实现栈和列表如下:
1 # encoding: utf-8 2 # __author__ = "wyb" 3 # date: 2018/9/28 4 5 6 class Stack(object): 7 def __init__(self): 8 self.lt = [] 9 10 def empty(self): 11 """ 12 判断栈是否为空 13 :return: 14 """ 15 return len(self.lt) == 0 16 17 def top(self): 18 """ 19 查看栈顶的对象,但不移除 20 :return: 21 """ 22 if not self.empty(): 23 return self.lt[-1] 24 return None 25 26 def push(self, obj): 27 """ 28 把对象压入栈顶 29 :return: 30 """ 31 self.lt.append(obj) 32 33 def pop(self): 34 """ 35 移除栈顶对象,并返回该对象的值 36 :return: 37 """ 38 if not self.empty(): 39 return self.lt.pop() 40 return None 41 42 def search(self, obj): 43 """ 44 返回对象在栈中的位置,以1为基数 45 :param obj: 46 :return: 47 """ 48 if not self.empty(): 49 return self.lt.index(obj) + 1 50 return -1 51 52 53 class Queue(object): 54 def __init__(self): 55 self.lt = [] 56 57 def empty(self): 58 """ 59 判断队列是否为空 60 :return: 61 """ 62 return len(self.lt) == 0 63 64 def first(self): 65 """ 66 查看队首的对象,但不移除 67 :return: 68 """ 69 if not self.empty(): 70 return self.lt[0] 71 return None 72 73 def enqueue(self, obj): 74 """ 75 将指定元素加入队列的尾部 76 :param obj: 77 :return: 78 """ 79 self.lt.append(obj) 80 81 def dequeue(self): 82 """ 83 移除队首对象,并返回该对象的值 84 :return: 85 """ 86 if not self.empty(): 87 return self.lt.pop(0) 88 return None 89 90 def search(self, obj): 91 """ 92 返回对象在队列中的位置,以1为基数 93 :param obj: 94 :return: 95 """ 96 if not self.empty(): 97 return self.lt.index(obj) + 1 98 return -1
用python list实现python中的set:
1 # encoding: utf-8 2 # __author__ = "wyb" 3 # date: 2018/9/29 4 5 6 class Set(object): 7 def __init__(self, *args): 8 self.table_size = 10007 9 self.data = [0] * self.table_size 10 for i in args: 11 self.add(i) 12 13 def __repr__(self): 14 """ 15 调用str及输出的魔法方法 16 :return: 17 """ 18 lt = set() 19 for i in range(0, len(self.data)): 20 if self.data[i] != 0: 21 item = self.data[i] 22 lt.add(item[0]) 23 return str(lt) 24 25 def __eq__(self, other): 26 """ 27 判断相等的魔法方法 28 :param other: 29 :return: 30 """ 31 if type(other) == type(self): 32 return str(self.data) == str(other.data) 33 else: 34 return False 35 36 def remove(self, x): 37 index = self._index(x) 38 self.data[index] = 0 39 40 def _index(self, obj): 41 index = hash(obj) % self.table_size 42 return index 43 44 def _insert_at_index(self, index, key): 45 v = self.data[index] 46 if v == 0: 47 self.data[index] = [key] 48 else: 49 return False 50 51 def add(self, key): 52 # 先计算出下标 53 index = self._index(key) 54 # 在下标处插入元素 55 self._insert_at_index(index, key) 56 57 # for i in range(0, len(self.data)): 58 # if self.data[i] == x: 59 # return False 60 # self.data.append(x) 61 62 def has(self, key): 63 index = self._index(key) 64 # 取元素 65 v = self.data[index] 66 if isinstance(v, list): 67 if v[0] == key: 68 return True 69 return False 70 71 # for i in range(0, len(self.data)): 72 # if self.data[i] == x: 73 # return True 74 # return False 75 76 77 def testSet(): 78 a = Set(1, 2, 2, 3, 4, 4) 79 b = Set(1, 2, 2, 3, 4) 80 c = Set(1, 3, 4, 2) 81 d = Set(2, 3) 82 assert (str(a) == '{1, 2, 3, 4}') 83 print(a, b, c, d) 84 assert (a == b) 85 assert (a == c) 86 assert (a != d) 87 assert (a.has(1) is True) 88 a.remove(1) 89 assert (a.has(1) is False) 90 a.add(1) 91 assert (a.has(1) is True) 92 93 94 if __name__ == '__main__': 95 testSet()
2.链表
我们可以将链表比作手拉手的盒子,一个盒子只能访问左右手的盒子
以下标方式读取元素的时间是 O(n),插入、删除是 O(1),栈和队列可以用链表实现,栈:先进后出,队列:先进先出
链表简单实现:
1 # encoding: utf-8 2 # __author__ = "wyb" 3 # date: 2018/9/27 4 5 6 class Node(): 7 def __init__(self, element=None): 8 self.e = element 9 self.next = None 10 11 12 def append(node, element): 13 """ 14 append: 添加一个元素到末尾 15 :param node: 是一个 Node 实例 16 :param element: 任意类型的元素 17 """ 18 n = node 19 while n.next is not None: 20 n = n.next 21 # n 现在是最后一个元素 22 new_node = Node(element) 23 n.next = new_node 24 25 26 def prepend(head_node, element): 27 """ 28 prepend: 添加一个元素到开头 29 :param head_node: 头元素 30 :param element: 任意类型的元素 31 :return: 32 """ 33 n = Node(element) 34 n.next = head_node.next 35 head_node.next = n 36 37 38 def pop(head_node): 39 """ 40 pop是stack的两个操作之一 41 push 入栈 42 pop 出栈 43 prepend + pop 就实现了 队列 的 入队(enqueue)和出队(dequeue)操作 44 append + pop 就实现了 栈 的 入栈(push) 和 出栈(pop)操作 45 :param head_node: 头部节点 46 :return: 47 """ 48 tail = head_node 49 while tail.next is not None: 50 tail = tail.next 51 # 现在 tail 是最后一个元素了 52 n = head_node 53 while n.next is not tail: 54 n = n.next 55 # 现在 n 是 tail 之前的元素了 56 n.next = None 57 return tail.e 58 59 60 def log_list(node): 61 n = node 62 s = '' 63 while n is not None: 64 s += (str(n.e) + ' > ') 65 n = n.next 66 print(s[0: -2]) 67 68 69 head = Node() 70 n1 = Node(111) 71 n2 = Node(222) 72 n3 = Node(333) 73 n1.next = n2 74 n2.next = n3 75 76 head.next = n1 77 78 log_list(n1) 79 append(n1, 'gua') 80 log_list(n1) 81 prepend(head, 'hello') 82 log_list(head) 83 print('pop head: ', pop(head)) 84 log_list(head)
链表封装成类:
1 # encoding: utf-8 2 # __author__ = "wyb" 3 # date: 2018/9/27 4 5 6 # 节点类 7 class Node(object): 8 def __init__(self, element=-1): 9 self.element = element 10 self.next = None 11 12 13 # 链表类 14 class LinkedList(object): 15 def __init__(self): 16 self.head = None 17 18 def is_empty(self): 19 """ 20 判断链表是否为空 21 :return: 22 """ 23 return self.head is None 24 25 def length(self): 26 """ 27 获得链表长度(包含head) 28 :return: 29 """ 30 index = 0 31 node = self.head 32 while node is not None: 33 index += 1 34 node = node.next 35 return index 36 37 def find(self, element): 38 """ 39 查找元素 40 :param element: 元素值 41 :return: 42 """ 43 node = self.head 44 while node is not None: 45 if node.element == element: 46 return node 47 node = node.next 48 return None 49 50 def _node_at_index(self, index): 51 """ 52 返回某个节点 53 :param index: 索引 -> 从0开始 0是head 54 :return: 55 """ 56 i = 0 57 node = self.head 58 while node is not None: 59 if i == index: 60 return node 61 node = node.next 62 i += 1 63 return None 64 65 def element_at_index(self, index): 66 """ 67 返回某个节点的值 68 :param index: 索引 -> 从0开始 0是head 69 :return: 70 """ 71 node = self._node_at_index(index) 72 return node.element 73 74 def first_object(self): 75 """ 76 返回第一个节点 -> head 77 :return: 78 """ 79 return self._node_at_index(0) 80 81 def last_object(self): 82 """ 83 返回最后一个节点 84 :return: 85 """ 86 i = 0 87 while self._node_at_index(i) is not None: 88 i += 1 89 return self._node_at_index(i - 1) 90 91 def insert_before_index(self, position, element): 92 """ 93 在节点之前插入元素 94 :param position: 节点位置 95 :param element: 元素值 96 :return: 97 """ 98 insert_node = Node(element) 99 # 错误情况判断: 100 if position == 0: 101 print("不能在head之前插入元素") 102 return False 103 if self._node_at_index(position) is None: 104 print("节点顺序超了!请输入正确的节点顺序!") 105 return False 106 node = self._node_at_index(position - 1) 107 # 插入元素 108 insert_node.next = node.next 109 node.next = insert_node 110 111 def insert_after_index(self, position, element): 112 """ 113 在节点之后插入元素 114 :param position: 节点位置 115 :param element: 元素值 116 :return: 117 """ 118 insert_node = Node(element) 119 node = self._node_at_index(position) 120 # 错误情况判断: 121 if node is None: 122 print("节点顺序超了!请输入正确的节点顺序!") 123 return False 124 # 在节点之后插入元素 125 insert_node.next = node.next 126 node.next = insert_node 127 128 def append(self, element): 129 """ 130 在最后插入节点 131 :param element: 节点值 132 :return: 133 """ 134 node = Node(element) 135 if self.head is None: 136 self.head.next = node 137 else: 138 last_node = self.last_object() 139 last_node.next = node 140 node.front = last_node 141 142 def prepend(self, element): 143 """ 144 在开头插入节点 145 :param element: 节点值 146 :return: 147 """ 148 node = Node(element) 149 node.next = self.head.next 150 self.head.next = node 151 152 def pop(self): 153 """ 154 删除最后一个节点 155 :return: 156 """ 157 tail = self.first_object() 158 while tail.next is not None: 159 tail = tail.next 160 # 现在 tail 是最后一个元素了 161 n = self.first_object() 162 while n.next is not tail: 163 n = n.next 164 # 现在 n 是 tail 之前的元素了 165 n.next = None 166 return tail.element 167 168 def log_list(self, msg=""): 169 """ 170 输出链表 171 :param msg: 输出链表之前显示的信息 172 :return: 173 """ 174 n = self.head.next 175 s = msg + '' 176 while n is not None: 177 s += (str(n.element) + ' > ') 178 n = n.next 179 print(s[0: -2]) 180 181 182 # 测试链表初始化及输出链表: 183 def test_log(): 184 head = Node(0) 185 n1 = Node(1) 186 n2 = Node(2) 187 n3 = Node(3) 188 lt = LinkedList() 189 lt.head = head 190 head.next = n1 191 n1.next = n2 192 n2.next = n3 193 lt.log_list("输出链表: ") 194 return lt 195 196 197 # 测试链表判空及链表长度: 198 def test_empty_length(lt): 199 if lt.is_empty() is True: 200 print("链表为空") 201 return None 202 else: 203 length = lt.length() 204 print("链表不为空, 链表长度为: ", length) 205 return length 206 207 208 # 测试find 209 def test_find(lt): 210 if lt.find(5) is None: 211 print("链表中不存在5") 212 else: 213 print("链表中存在5") 214 node = lt.find(5) 215 return node 216 217 if lt.find(3) is None: 218 print("链表中不存在3") 219 else: 220 print("链表中存在3") 221 node = lt.find(3) 222 return node 223 224 225 # 测试element_at_index 226 def test_element_at_index(lt): 227 print(lt.element_at_index(0)) 228 print(lt.element_at_index(1)) 229 print(lt.element_at_index(2)) 230 print(lt.element_at_index(3)) 231 232 233 # 测试first_obj和last_obj 234 def test_first_last(lt): 235 print(lt.first_object().element) 236 print(lt.last_object().element) 237 238 239 # 测试插入 240 def test_insert(lt): 241 lt.insert_before_index(0, "在节点0之前插入") 242 lt.log_list() 243 lt.insert_before_index(1, "在节点1之前插入") 244 lt.log_list() 245 lt.insert_after_index(0, "在节点0之后插入") 246 lt.log_list() 247 lt.insert_after_index(2, "在节点2之后插入") 248 lt.log_list() 249 lt.append("在最后插入节点") 250 lt.log_list() 251 lt.prepend("在开头插入节点") 252 lt.log_list() 253 254 255 # 测试pop 256 def test_pop(lt): 257 lt.pop() 258 lt.log_list("删除最后一个元素: ") 259 260 261 # 单元测试 262 def test(): 263 linked_list = test_log() 264 265 # 测试空链表: 266 # test_empty_length(LinkedList()) 267 268 # 测试非空链表: 269 # test_empty_length(linked_list) 270 271 # 测试find 272 # test_find(linked_list) 273 274 # 测试element_at_index 275 # test_element_at_index(linked_list) 276 277 # 测试first_obj和last_obj 278 # test_first_last(linked_list) 279 280 # 测试insert 281 # test_insert(linked_list) 282 283 # 测试pop 284 # test_pop(linked_list) 285 286 287 if __name__ == '__main__': 288 test()