Python常见的数据结构实现
一、链表class LinkNode: #单链表结点类 def __init__(self,data=None): #构造函数 self.data=data #data属性 self.next=None class LinkList: #单链表类 def __init__(self): #构造函数 self.head=LinkNode() #头结点head self.head.next=None def CreateListF(self, a): #头插法:由数组a整体建立单链表 for i in range(0,len(a)): #循环建立数据结点s s=LinkNode(a[i]) #新建存放a[i]元素的结点s s.next=self.head.next #将s结点插入到开始结点之前,头结点之后 self.head.next=s def CreateListR(self, a): #尾插法:由数组a整体建立单链表 t=self.head #t始终指向尾结点,开始时指向头结点 for i in range(0,len(a)): #循环建立数据结点s s=LinkNode(a[i]); #新建存放a[i]元素的结点s t.next=s #将s结点插入t结点之后 t=s t.next=None #将尾结点的next成员置为null def geti(self, i): #返回序号为i的结点 p=self.head j=-1 while (j=0 #检测参数i正确性的断言 p=self.geti(i) assert p is not None #p不为空的检测 return p.data def __setitem__(self, i, x): #设置序号为i的元素 assert i>=0 #检测参数i正确性的断言 p=self.geti(i) assert p is not None #p不为空的检测 p.data=x def GetNo(self,e): #查找第一个为e的元素的序号 j=0 p=self.head.next while p is not None and p.data!=e: j+=1 #查找元素e p=p.next if p is None: return -1 #未找到时返回-1 else: return j #找到后返回其序号 def Insert(self, i, e): #在线性表中序号i位置插入元素e assert i>=0 #检测参数i正确性的断言 s=LinkNode(e) #建立新结点s p=self.geti(i-1) #找到序号为i-1的结点p assert p is not None #p不为空的检测 s.next=p.next #在p结点后面插入s结点 p.next=s def Delete(self,i): #在线性表中删除序号i位置的元素 assert i>=0 #检测参数i正确性的断言 p=self.geti(i-1) #找到序号为i-1的结点p assert p.next is not None #p.next不为空的检测 p.next=p.next.next; #删除p结点的后继结点 def display(self): #输出线性表 p=self.head.next while p is not None: print(p.data,end=" ") p=p.next; print()if __name__ == "__main__": L=LinkList() for i in range(1,6): L.Add(i) print("L: ",end=""),L.display() print("序号为2的元素=%d" %(L[2])) print("设置序号为2的元素为8") L[2]=8 print("序号为2的元素=%d" %(L[2])) n=L.getsize() print("size=%d" %(n)) for i in range(0,n): print("删除%d序号的元素" %(0)) L.Delete(0) print("L: ",end=""),L.display() print("size=%d" %(L.getsize()))
二、顺序表 class SqList: def __init__(self): #构造函数 self.initcapacity=5; #初始容量设置为10 self.capacity=self.initcapacity #容量设置为初始容量 self.data=[None]*self.capacity #设置顺序表的空间 self.size=0 #长度设置为0 def resize(self, newcapacity): #改变顺序表的容量为newcapacity assert newcapacity>=0 #检测参数正确性的断言 olddata=self.data self.data=[None]*newcapacity self.capacity=newcapacity for i in range(self.size): self.data[i]=olddata[i] def CreateList(self, a): #由数组a中元素整体建立顺序表 for i in range(0,len(a)): if self.size==self.capacity: #出现上溢出时 self.resize(2*self.size); #扩大容量 self.data[self.size]=a[i] self.size+=1 #添加后元素个数增加1 def Add(self, e): #在线性表的末尾添加一个元素e if self.size==self.capacity: #顺序表空间满时倍增容量 self.resize(2*self.size) self.data[self.size]=e #添加元素e self.size+=1 #长度增1 def getsize(self): #返回长度 return self.size def __getitem__(self,i): #求序号为i的元素 assert 0<=i=self.size): #未找到时返回-1 return -1; else: return i; #找到后返回其序号 def Insert(self, i, e): #在线性表中序号i位置插入元素e assert 0<=i<=self.size #检测参数i正确性的断言 if self.size==self.capacity: #满时倍增容量 self.resize(2*self.size) for j in range(self.size,i,-1): #将data[i]及后面元素后移一个位置 self.data[j]=self.data[j-1] self.data[i]=e #插入元素e self.size+=1 #长度增1 def Delete(self, i): #在线性表中删除序号i的元素 assert 0<=i<=self.size-1 #检测参数i正确性的断言 for j in range(i,self.size-1): self.data[j]=self.data[j+1] #将data[i]之后的元素前移一个位置 self.size-=1 #长度减1 if self.capacity>self.initcapacity and self.size<=self.capacity/4: self.resize(self.capacity//2) #满足要求容量减半 def display(self): #输出顺序表 for i in range(0,self.size): print(self.data[i],end=" ") print() if __name__ == "__main__": L=SqList() for i in range(1,6): L.Add(i) print("L: ",end=""),L.display() print("序号为2的元素=%d" %(L[2])) print("设置序号为2的元素为8") L[2]=8 print("序号为2的元素=%d" %(L[2])) n=L.getsize() print("size=%d" %(n)) for i in range(0,n): print("删除%d序号的元素" %(0)) L.Delete(0) print("L: ",end=""),L.display() print("size=%d" %(L.getsize()))
三、顺序栈 #顺序栈 class SqStack: def __init__(self): #构造函数 self.data=[] #存放栈中元素,初始为空 def empty(self): #判断栈是否为空 if len(self.data)==0: return True return False def push(self,e): #元素e进栈 self.data.append(e) def pop(self): #元素出栈 assert not self.empty() #检测栈为空 return self.data.pop() def gettop(self): #取栈顶元素 assert not self.empty() #检测栈为空 return self.data[len(self.data)-1] if __name__ == "__main__": st=SqStack() st.push(1) st.push(2) st.push(3) st.push(4) print("出栈顺序:",end=" ") while not st.empty(): print(st.pop(),end=" ") print()
四、非循环列表 MaxSize=100 #假设容量为100 class SqQueue: #非循环队列类 def __init__(self): #构造方法 self.data=[None]*MaxSize #存放队列中元素 self.front=-1 #队头指针 self.rear=-1 #队尾指针 def empty(self): #判断队列是否为空 return self.front==self.rear def push(self,e): #元素e进队 assert not self.rear==MaxSize-1 #检测队满 self.rear+=1 self.data[self.rear]=e def pop(self): #出队元素 assert not self.empty() #检测队空 self.front+=1 return self.data[self.front] def gethead(self): #取队头元素 assert not self.empty() #检测队空 return self.data[self.front+1] if __name__ == "__main__": qu=SqQueue() qu.push(1) qu.push(2) qu.push(3) while not qu.empty(): print(qu.pop(),end=" ") print()
五、链栈 class LinkNode: #单链表结点类 def __init__(self,data=None): #构造方法 self.data=data #data域 self.next=None #next域 class LinkStack: #链栈类 def __init__(self): #构造方法 self.head=LinkNode() #头结点head self.head.next=None def empty(self): #判断栈是否为空 if self.head.next==None: return True return False def push(self,e): #元素e进栈 p=LinkNode(e) p.next=self.head.next self.head.next=p def pop(self): #元素出栈 assert self.head.next!=None #检测空栈的异常 p=self.head.next; self.head.next=p.next return p.data def gettop(self): #取栈顶元素 assert self.head.next!=None #检测空栈的异常 return self.head.next.data if __name__ == "__main__": st=LinkStack() st.push(1) st.push(2) st.push(3) st.push(4) print("出栈顺序:",end=" ") while not st.empty(): print(st.pop(),end=" ") print()
六、链队 class LinkNode: #链队结点类 def __init__(self,data=None): #构造方法 self.data=data #data域 self.next=None #next域 class LinkQueue: #链队类 def __init__(self): #构造方法 self.front=None #队头指针 self.rear=None #队尾指针 def empty(self): #判断队是否为空 return self.front==None def push(self,e): #元素e进队 s=LinkNode(e) #新建结点s if self.empty(): #原链队为空 self.front=self.rear=s else: #原链队不空 self.rear.next=s #将s结点链接到rear结点后面 self.rear=s def pop(self): #出队操作 assert not self.empty() #检测空链队 if self.front==self.rear: #原链队只有一个结点 e=self.front.data #取首结点值 self.front=self.rear=None #置为空队 else: #原链队有多个结点 e=self.front.data #取首结点值 self.front=self.front.next #front指向下一个结点 return e def gethead(self): #取队顶元素操作 assert not self.empty() #检测空链队 e=self.front.data #取首结点值 return e if __name__ == "__main__": qu=LinkQueue() qu.push(1) qu.push(2) qu.push(3) qu.push(4) print("队头元素: %d" %(qu.gethead())) print("出队顺序:",end=" ") while not qu.empty(): print(qu.pop(),end=" ") print()
七、顺序栈 #顺序栈 class SqStack: def __init__(self): #构造函数 self.data=[] #存放栈中元素,初始为空 def empty(self): #判断栈是否为空 if len(self.data)==0: return True return False def push(self,e): #元素e进栈 self.data.append(e) def pop(self): #元素出栈 assert not self.empty() #检测栈为空 return self.data.pop() def gettop(self): #取栈顶元素 assert not self.empty() #检测栈为空 return self.data[len(self.data)-1] if __name__ == "__main__": st=SqStack() st.push(1) st.push(2) st.push(3) st.push(4) print("出栈顺序:",end=" ") while not st.empty(): print(st.pop(),end=" ") print()
vivo手机通讯录如何搬迁到华为手机我的vivox21手机入手已5年电池已下岗,换个华为妹特10泼肉,传通讯录时候,我发现传统方法不行(蓝牙,wlan),于是上网搜方法,都是下载克隆软件,互传软件,反正就是各种软件。
首发5K买不起,现在800卖不了,索尼RX0到底香不香?运动相机最火的那年,索尼也出了一款索尼RX0,当年4899,本地拍视频的老法师有一台,我体验过几次,虽然很不错,但价格太贵,另一方面,当年自己是以拍照片为主,又不拍视频,实在用不到
买红米K50Pro还是iQOONeo6?仔细对比6点之后,终于明白了iQOONeo6已经发布了,作为发布价最便宜的骁龙8Gen1手机,该机上市之后受到了全网数千万用户的关注。这不,最近就有粉丝私信小编,说这款手机和红米K50Pro相比,到底谁更值得
1395亿!P2P网贷教父被起诉!有哪些警醒?1395亿!!!网贷教父周世平被起诉!给我们普通人有哪些警醒?4月14日,网贷教父周世平被起诉,据告知书,该案件集资参与人累计51。68万名,非法集资1395亿元,造成11。96万
大批iphone价格再次触底,等等党不要乱买,这3款性价比最高最近大概看了一下国内旗舰机的表现,官方价格依旧坚挺。5000元价格段的手机,iQOO9Pro降幅算是比较大的,为300块钱。其他几款基本上不降,或者是100多。但是再看看第三方店铺
又一6000mAh新机备货,12256G低至1399,诚意太足了对于经常出远门,或者说经常出去聚会工作学习的群体来说,其实在买手机的时候,比较建议大家选择大电池类型,因为电池大续航更好,充满电带着出去不担心没电。但需要注意的是,现在手机界的电池
我有两块显示屏,体验能翻倍吗?其实在我眼中,便携式显示器这一细分品类面向的客户更多的是商务一族和游戏玩家居多,如果你最近在想添置一款便携式显示器,不妨可以看看这款雕塑家MF16LC便携式显示器在连接多设备上,有
工业互联网必须回归工业本质工业互联网,必须回归工业本质网上有一个很流行的笑话,大意是,韩国爆发了传染病,有一个被感染的女孩,从医院走丢了。还好,有女孩的照片。于是,全城大搜捕。结果。警察蜀黍竟然抓了400个
DECampamp39SJAVA第1课基础学习JavaSEJava标准版本JavaEEJava企业版JavaMEJava微型版(移动设备和嵌入式设备)JDKJava开发工具包(开发人员必须安装)JREJava运行环境(运行Ja
亚马逊编年史了解首富贝索斯听樊登读书亚马逊编年史去了解一个企业了解一个人!亚马逊的AWS(云服务)作为一个独立业务,在2005年开始起步。贝索斯的前瞻性,以为阿里云挺牛,但是思路原来源自于亚马逊。并且AWS
安装设置Redis安装Redis打开终端,输入命令sudoaptgetinstallredisserver设置Redissudovimetcredisredis。conf打开远程连接将bind修改为
详解GPU的内存带宽与CPU的不同在先前的文章中我们谈到GPU相比CPU有更大的内存带宽,此言不虚,这也是众核GPU有源源不断数据弹药供给,能够发挥强大算力的主要原因。如下表所示(GDDR和HBM都是GPU的显存规
5G时代,4G手机为何还能持久使用前段时间国内手机华为还是推出了4G版本的华为P50系列,虽然说5G芯片被限制但是从华为推出4G手机来看,虽然进入5G时代,但是4G手机还是没能影响使用,甚至有用户为了节约电量主动关
手机听筒或者外放喇叭进水了,一招教你解决!(亲测有效)手机进水经常有的事,特别是听筒和外放喇叭。之前网上教大家套上袋子放米桶的方法我觉得太麻烦,要急着用手机的根本等不了那么长时间。今天就用亲身经历来告诉大家,快速在一分钟内解决。事情起
火锅店连锁如何用大数据科学选址火锅店连锁如何用大数据科学选址大数据(bigdata),IT行业术语,是指无法在一定时间范围内用常规软件工具进行捕捉管理和处理的数据集合,是需要新处理模式才能具有更强的决策力洞察发
老婆觉得500块钱以上的路由器很贵,坚持买200以下的怎么办?适用即可,一个节俭的人不致于生活拮据,因为你不是富豪,更因为你赚钱不易。一个家庭的经济如果是不量体裁衣的去消费,或者你是寅吃卯粮的没节制,一旦遇到不可预测的情况,那么你的生活境况是
BOSE是怎样的一个品牌?先说说我和BOSE的邂逅过程BOSE的音箱产品很早就通过一些渠道进入国内,特别是80年代90年代。我第一次听到BOSE是在97年的汕头音响大展,当年是第一届,当年听到的BOSE是一
朴实无华且枯燥SPEARLabsTriton双子试玩手记春风不度玉门关,又见才子伴乐谈。本期的分享,是非常小(gui)众(zhong)的产品,来自美国的科研品牌SPEARLabs,它们既是才子伴乐谈连载到现在,耳塞产品里面单体价格最高的
大一即将开学入学换机推荐经历过高考后,相信不少考生在报完志愿后经过焦急的等待终于拿到了属于自己的那份象牙塔通知书,也不必再忧虑是否要复读。那么准备新生入学必不可少的便是换一身新装备,那么伴随你大学生活最密
雷军我的梦想,我的选择小米造车的优势66小米开始造车3月30日,小米在遮遮掩掩了很长时间后,最终还是在小米集团港股盘后发布公告称,董事会已经正式批准智能电动汽车业务立项,公司拟成立一家全资子公司负责智能电动汽车业务,首期
比特币算法调整,矿工们要破产,显卡有救了第1151期比特币算法调整,矿工们要破产,显卡有救了文李蓬阁责编王晔封面执行王晔策划刘克丽校对刘芳佐上周比特币算法调整后,使破解一个区块的难度增加了约7。3,矿工挖矿难度大幅增加。
QQ重新测试支持苹果CallKit8月17日消息,腾讯QQiOS测试版升级到8。8。20版本,部分用户开始支持苹果CallKit功能。CallKit是iOS10推出的开发框架,它能实现VoIP应用程序集成到iPho