欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

三种基本数据结构,栈,队列,链表的定义及python实现(数据结构与算法1)

时间:2023-05-27

1.栈
定义:栈是元素的有序集合,添加操作和移除操作都发生在其顶端。其操作顺序为LIFO(last in first out)
根据其定义和特性可用如下Python代码实现栈。

class Stack(): def __init__(self): self.items=[] def isEmpty(self): return self.items==[] def push(self,item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[len(self.items)-1] def size(self): return len(self.items)

2.队列
队列是有序集合,添加操作发生在其尾部,移除操作则发生在其头部,其操作顺序为FIFO(first in first out).根据其定义和特性可用如下Python代码实现队列。

class Queue: def __init__(self): self.items=[] def isEmpty(self): self.items==[] def enqueue(self,item): self.items.insert(0,item) def dequeue(self): self.items.pop() def size(self): return len(self.items)

3.链表
链表也是一种基本的数据结构。其每一个节点里面存放下一个节点的位置信息。根据其定义和特性可由如下Python代码实现。

1、"""单链表的结点,里面存放element区和next"""相当于元祖(element,next)class SingleNode(object): def __init__(self,item): # _item存放数据元素 self.item = item # _next是下一个节点的标识 self.next = None2."""单链表数据结构类,具有以下功能"""相当于python中的list数据结构类,同时它也具有以下功能class SinglelinkList(object): """存放一个属性P,好用来指向第一个节点""" def __init__(self,): self._head = None# _ 私有属性,head=None说明P指向的单链表中没有node def is_empty(self): """判断链表是否为空""" return self._head == None def length(self): """链表长度""" # current游标用来遍历节点,初始时指向头节点 cur = self._head#直接指到第一个节点 count = 0 # 尾节点指向None,当未到达尾部时 while cur != None: count += 1 # 将cur后移一个节点 cur = cur.next #相当于指向下一个节点 return count def travel(self): """遍历链表""" cur = self._head#直接指到第一个节点 while cur != None: print cur.item,#打印第一个节点 cur = cur.next#相当于指向下一个节点 print "" def add(self, item): """头部添加元素""" # 先创建一个保存item值的节点 node = SingleNode(item) # 将新节点的链接域next指向头节点,即_head指向的位置,有先后,否则会丢失链 node.next = self._head # 将链表的头_head指向新节点 self._head = node def append(self, item): """尾部添加元素""" node = SingleNode(item) # 先判断链表是否为空,若是空链表,则将_head指向新节点 if self.is_empty(): self._head = node#append时候,我只要保证把我的node地址给你就行,node.next不用管 # 若不为空,则找到尾部,将尾节点的next指向新节点 else: cur = self._head while cur.next != None: cur = cur.next cur.next = node#直接将node送给cur.next,内部操作就是把node结点地址给他 """指定位置添加元素"""def insert(self, pos, item): # 若指定位置pos为第一个元素之前,则执行头部插入 if pos <= 0: self.add(item) # 若指定位置超过链表尾部,则执行尾部插入 elif pos > (self.length()-1): self.append(item) # 找到指定位置 else: node = SingleNode(item) count = 0 # pre用来指向指定位置pos的前一个位置pos-1,初始从头节点开始移动到指定位置 pre = self._head while count < (pos-1): count += 1 pre = pre.next # 先将新节点node的next指向插入位置的节点 node.next = pre.next # 将插入位置的前一个节点的next指向新节点 pre.next = node """链表查找节点是否存在,并返回True或者False"""def search(self,item): cur = self._head while cur != None:#一直往后走,起到遇到none停止 if cur.item == item: return True cur = cur.next return Falsedef remove(self,item): """删除节点""" cur = self._head pre = None while cur != None: # 找到了指定元素 if cur.item == item: # 如果第一个就是删除的节点 if not pre: # 将头指针指向头节点的后一个节点 self._head = cur.next else: # 将删除位置前一个节点的next指向删除位置的后一个节点 pre.next = cur.next break else: # 继续按链表后移节点 pre = cur cur = cur.next————————————————版权声明:本文为CSDN博主「Mr DaYang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/m0_46204224/article/details/107774211

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。