python数据结构
来源:互联网 发布:java流行开源框架 编辑:程序博客网 时间:2024/06/04 19:54
1、栈(后进先出)
代码:
# -*- coding: cp936 -*-class Stack: """模拟栈""" def __init__(self): self.items=[]; def isEmpty(self): return len(self.items)==0; def push(self,item): self.items.append(item); def pop(self): return self.items.pop(); def peek(self): if not self.isEmpty(): return self.items[len(self.items)-1] def size(self): return len(self.items);s=Stack();print(s.isEmpty());s.push('DataA');s.push('DataB');print(s.peek());s.push('DataC');print(s.size());print(s.isEmpty());s.push('DataD');print(s.pop());print(s.pop());print(s.size());实验结果为:
2、队列(先进先出)
实验代码:
class Queue(object): def __init__(self): self.queue=[]; def isEmpty(self): return self.queue==[]; def enqueue(self,item): self.queue.append(item); def dequeue(self): if self.queue!=[]: return self.queue.pop(0); else: return None def head(self): if self.queue!=[]: return self.queue[0]; else: return None def tail(self): if self.queue!=[]: return self.queue[-1]; else: return None def length(self): return len(self.queue)q=Queue();print(q.isEmpty());q.enqueue('DataA');q.enqueue('DataB');print(q.head());print(q.tail());q.enqueue('DataC');print(q.length());print(q.isEmpty());q.enqueue('DataD');print(q.dequeue());print(q.dequeue());print(q.length());
实验结果:
问题:为什么tail()函数中self.queue[-1]下标为-1 呐?
3、树(非线性的数据结构)(具有非常高的层次性,在很大程度上节约存储空间)
二叉树:要么是空树,要么有左右两个子树。是一个有序树,即使只有一个子树,也要区分该子树是左子树还是右子树。二叉树有两种存储方式,一种是顺序存储,一种是链式存储。顺序存储中采用一维数组的存储方式;链式存储,采用链表的存储方式。在链式存储中,树节点包含数据域、左子链域、右子链域。
完全二叉树:指除最后一层外,每一层上的节点数均达到最大值,在最后一层上只缺少右边的若干节点。
满二叉树:是一种特殊的完全二叉树,指除最后一层无任何子节点外,每一层上的所有节点都有两个子节点的二叉树。
遍历二叉树的思想:要让树中的所有节点被且仅被访问一次,即按一定规律排列成一个线性队列。
实验代码:
# -*- coding: cp936 -*-class Node(object): def __init__(self,data=-1,lchild=None,rchild=None): self.data=data; self.lchild=lchild; self.rchild=rchild;class BinaryTree(object): def __init__(self): self.root=Node(); def add(self,data): node=Node(data); if self.isEmpty(): self.root=node; else: tree_node=self.root; queue=[]; queue.append(self.root); while queue: tree_node=queue.pop(0) if tree_node.lchild==None: tree_node.lchild=node return; elif tree_node.rchild==None: tree_node.rchild=node; return; else: queue.append(tree_node.lchild); queue.append(tree_node.rchild); def pre_order(self,start): node=start; if node==None: return; print node.data; if node.lchild==None and node.rchild==None: return; self.pre_order(node.lchild); self.pre_order(node.rchild); def in_order(self,start): node=start; if node==None: return; self.in_order(node.lchild); print node.data; self.in_order(node.rchild); def post_order(self,start): node=start; if node==None: return; self.post_order(node.lchild); self.post_order(node.rchild); print node.data; def isEmpty(self): return True if self.root.data==-1 else False; def length(self): return len(self.queue);if __name__=='__main__': arr=[]; for i in range(10): arr.append(i); print arr; tree=BinaryTree(); for i in arr: tree.add(i); print 'pre order:'; tree.pre_order(tree.root); print '\n in_order:' tree.in_order(tree.root); print '\npost_order:' tree.post_order(tree.root);
实验结果为:
分析图片:
4、链表
实验代码:
# -*- coding: cp936 -*-class Node(): __slots__=['_item','_next'];#限定实例属性 def __init__(self,item): self._item=item; self._next=None; def getItem(self): return self._item; def getNext(self): return self._next; def setItem(self,newitem): self._item=newitem; def setNext(self,newnext): self._next=newnext;class SingleLinkedList(): def __init__(self): self._head=None; self._size=0; def isEmpty(self): return self._head==None; #add()函数用于在链表前端添加元素 def add(self,item): temp=Node(item); temp.setNext(self._head); self._head=temp; def append(self,item): temp=Node(item); if self.isEmpty(): self._head=temp else: current=self._head; while current.getNext()!=None: current=current.getNext(); current.setNext(temp); #index()函数用于返回指定元素在链表中的位置,注,返回的并不是下标,而是第几个位置 def index(self,item): current=self._head; count=0; found=None; while current!=None and not found: count+=1; if current.getItem()==item: found=True; else: current=current.getNext(); if found: return count; else: raise ValueError,'%s is not in linkedlist '%item def remove(self,item): current=self._head; pre=None; while current!=None: if current.getItem()==item: if not pre: self._head=current.getNext();#该链表就一个节点,并且就是要删的节点时。 else: pre.setNext(current.getNext()); break; else: pre=current; current=current.getNext(); def insert(self,pos,item): if pos<=1: self.add(item); elif pos>self.size(): self.append(item); else: temp=Node(item); count=1; pre=None; current=self._head; while count<pos: count+=1; pre=current; current=current.getNext(); pre.setNext(temp); temp.setNext(current); def size(self): count=0; if self.isEmpty(): return count; else: current=self._head; count=1; while current.getNext()!=None: current=current.getNext(); count+=1; return count; def travel(self): if self.isEmpty(): print "null"; else: current=self._head; while current.getNext()!=None: print current.getItem(); current=current.getNext(); print current.getItem(); if __name__=='__main__': a=SingleLinkedList(); for i in range(1,10): a.append(i); print "链表长度为:"+str(a.size()); print "打印单向链表元素:" a.travel(); print "打印第5个元素:"+str(a.index(5)); a.remove(4); print "删除完位置4的元素:"; a.travel(); a.insert(4,100); print "插入4位置100:" a.travel();
实验结果为:
阅读全文
0 0
- python数据结构
- python数据结构
- python 数据结构
- python 数据结构
- Python 数据结构
- Python数据结构
- python 数据结构
- python 数据结构
- python 数据结构
- python数据结构
- python-数据结构
- python数据结构
- python,数据结构
- Python-----数据结构
- python数据结构
- python 数据结构
- Python:数据结构
- python数据结构
- 文件复制
- 初始Cakephp,新手入门安装与配置
- androidの设计的布局在阿拉伯语下界面错乱的解决方法 总汇
- 英国“支付宝”也要搞VR支付了
- 【算法题】集合
- python数据结构
- Unity3D的Android移动之路----了解触控
- Spring--IoC--基于注解的DI-@Component相关注解
- 通信系统仿真速成第6天:OFDM基带仿真(简单教学版)
- 对纯for循环进行并行流和线程池优化简记
- JavaScript中this对象的绑定
- 什么是函数式编程
- nasm汇编中的宏定义
- Kotlin 自动跳转Activity