Python实现常用的逻辑数据结构
逻辑数据结构包括:线形结构、树形结构、图形结构、集合;存储结构包括:顺序存储、链式存储、索引存储、散列存储。
同一种逻辑结构可以有四种存储结构,不同的存储结构增、删、查、改的速度不同。逻辑结构与存储结构排列组合,就得到4*4=16种结构。
在C/C++中,栈和队列的常用实现方式为数组和链表,存储方式分别是:顺序存储和链式存储。
在Python中,栈和队列的常用实现方式为list,存储方式是索引,实现起来要比C/C++简单的多,而且大小可以动态扩展,存取也非常方便,可以说它集成了顺序存储
和链式存储的优点,索引表本身就是顺序存储啊,就是数组,它是怎样实现动态扩展长度的呢?这个就不知道了,有空看看Python的实现代码源代码。Python也是可以
用链式存储实现线性结构的,见下面的代码,但没有list实现方便。C/C++中的内置类型(类)中没有索引存储的,你也许想到指针数组,的确,它是一种索引结构,但用
它不容易实现线性结构,因为当你添加元素时,要先用变量创建该元素,而且变量名与线性表中已有元素的变量名不能相同,每次添加都要用不同的变量名,看来这种方
式不行,那我们可以动态molloc,用指针指向该molloc,然后通过指针给新元素赋值,然后再把指针指向的地址保存在链表数组中,这样是可以,但太麻烦了。在Python
中,编程语言自动帮你实现了这个过程,这对用户来说就简单的一比了。总得来说,用list实现栈和队列和两种方法,一种是实例对象的数据属性是list,另一种是类直接
继承list类。第二种方法简单,但由于继承了list,而list提供了很多对外接口,如extend()等,这些接口其实是标准栈不应该有的。所以建议用第一种方法实现。
Stack类--实现1(推荐)
- class Stack(list):
- def __init__(self):
- self.__stack = []
- def is_empty(self):
- return not bool(len(self))
- def push(self,data):
- self.__stack.append(data)
- def pop(self):
- if len(self.__stack)>0:
- return self.__stack.pop()
- def peek(self):
if len(self.__stack)>0:- return self.__stack[-1]
- def get_length(self):
- return len(self.__stack)
Stack类--实现2(不建议使用)
- class Stack(list):
- def is_empty(self):
- return not bool(len(self))
- def push(self,data):
- self.append(data)
- def pop(self):
- if len(self)>0:
- return self.pop()
- def peek(self):
- if len(self)>0:
- return self[-1]
- def get_length(self):
- return len(self)
Stack类--实现3(链式存储,不建议使用)
- class Node(object):
- def __init__(self,data):
- self.data = data
- self.next = None
- class Stack(object):
- def __init__(self,head_node):
- self.top = head_node
- self.bottom = head_node
- def push(self,node):
- node.next = self.top
- self.top = node
- def pop(self):
- if self.top == None:
- return None
- else:
- key = self.top
- self.top = self.top.next
- if self.top == None:
- self.bottom = None
- return key
- s = Stack(Node(12))
- s.push(Node(13))
- s.push(Node(15))
- s.push(Node(18))
- s.push(Node(2))
- while True:
- a = s.pop()
- if a != None:
- print a.data
- continue
- else:
- break
Queue类--实现1(推荐)
- class Queue(object):
- def __init__(self):
- self.__queue = []
- def is_empty(self):
- return not bool(len(self.__queue))
- def peek(self):
if len(self.__queue)>0:- return self.__stack[0]
- def enqueue(self,node):
- self.__queue.append(node)
- def dequeue(self):
- if len(self.__queue)>0:
- return self.__queue.pop(0)
- def get_length(self):
- return len(self.__queue)
Queue类--实现2(不建议使用)
- class Queue(list):
- def is_empty(self):
- return not bool(len(self))
- def peek(self):
if len(self)>0- return self[0]
- def enqueue(self,node):
- self.append(node)
- def dequeue(self,node):
- if len(self)>0:
- return self.pop(0)
- def get_length(self):
- return len(self)
BST类(二叉树类)
我们一般很少用一般二叉树,而是用进一步约束的二叉树,如二叉搜索树、红黑树等,这些树是一般二叉树的子类,
所以二叉树有的方法,这些方法都可以有。
- class Node(object):
- def __init__(self,data):
- self.data = data
- self.__left = None
- self.__right = None
- self.__parent = None
- @property
- def left(self):
- return self.__left
- @left.setter
- def left(self,node):
- if node is None or type(node) is Node:
- self.__left = node
- if type(node) is Node:
- node.parent = self
- else:
- raise Exception,'left node must be None or Node type'
- @property
- def right(self):
- return self.__right
- @right.setter
- def right(self,node):
- if node is None or type(node) is Node:
- self.__right = node
- if type(node) is Node:
- node.parent = self
- else:
- raise Exception,'right node must be None or Node type'
- @property
- def parent(self):
- return self.__parent
- @parent.setter
- def parent(self,node):
- if node is None or type(node) is Node:
- self.__parent = node
- else:
- raise Exception,'parent node must be None or Node type'
- class BST(object):
- def __init__(self):
- self.__root = None
- @property
- def root(self):
- return self.__root
- @root.setter
- def root(self,node):
- if node is None or type(node) is Node:
- self.__root = node
- if type(node) is Node:
- node.parent = None
- else:
- raise Exception,'parent node must be None or Node type'
- def pre_order(self,node):
- #递归结束点
- if node == None:
- return []
- #分支结点
- data = [node.data]
- left = self.pre_order(node.left)
- right = self.pre_order(node.right)
- return data +left +right
- def in_order(self,node):
- if node == None:
- return []
- left = self.pre_order(node.left)
- data = [node.data]
- right = self.pre_order(node.right)
- return left + data + right
- def post_order(self,node):
- if node == None:
- return []
- left = self.pre_order(node.left)
- right = self.pre_order(node.right)
- data = [node.data]
- return left + right + data
- #查找以node为根结节的树的最大关键值节点
- def find_max(self,node):
- if node == None:
- return None
- p = node
- while True:
- if p.right != None:
- p = p.right
- continue
- else:
- break
- return p
- def find_min(self,node):
- if node == None:
- return None
- p = node
- while True:
- if p.left != None:
- p = p.left
- continue
- else:
- break
- return p
- def search(self,node,key):
- # 跟二分查找的递归方式非常像
- #结束点
- if node == None:
- return None
- #分支节点
- if key == node.data:
- return node
- if key > node.data:
- return self.search(node.right,key)
- else:
- return self.search(node.left,key)
- def insert(self,root,new_node):
- #结束点
- if new_node.data > root.data:
- if root.right == None:
- root.right = new_node
- return True
- if new_node.data == root.data:
- return False
- if new_node.data < root.data:
- if root.left == None:
- root.left = new_node
- return True
- #分支节点
- if new_node.data > root.data:
- if root.right != None:
- branch_ret = self.insert(root.right,new_node)
- if new_node.data < root.data:
- if root.left != None:
- branch_ret = self.insert(root.left,new_node)
- return branch_ret
- def delete(self,node):
- #这个方法比较繁琐,有空再写
- pass
Python实现常用的逻辑数据结构的更多相关文章
- python 下的数据结构与算法---2:大O符号与常用算法和数据结构的复杂度速查表
目录: 一:大O记法 二:各函数高阶比较 三:常用算法和数据结构的复杂度速查表 四:常见的logn是怎么来的 一:大O记法 算法复杂度记法有很多种,其中最常用的就是Big O notation(大O记 ...
- Python实现常用的数据结构
Python中的数据结构 #巧用Python列表特性实现特定数据结构 #栈实现stack = []stack.push(x)stack.pop()stack[-1] #队列实现from colle ...
- Python实现常用排序算法
Python实现常用排序算法 冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...
- 【转】python 历险记(四)— python 中常用的 json 操作
[转]python 历险记(四)— python 中常用的 json 操作 目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编 ...
- python 历险记(四)— python 中常用的 json 操作
目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编码和解码? 常用的 json 操作有哪些? json 操作需要什么库? 如何 ...
- Python学习(四)数据结构(概要)
Python 数据结构 本章介绍 Python 主要的 built-type(内建数据类型),包括如下: Numeric types int float Text Sequence ...
- python教程(二)·数据结构初探
这一节,我来简单讲讲python自带的数据结构. 列表(list) 列表是常用的python数据结构,类似于C语言的数组,用来存储多个元素,与之不同的是,C语言的数组中的元素的类型是相同的,而列表可以 ...
- Python 基础 常用运算符
Python 基础 常用运算符 计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算术运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算. 今天我们暂只学习 算术运算. ...
- python之常用正则表达式
以下整理python中常用的正则符号,相信能够熟悉掌握这些正则符号,大部分字符串处理将会游刃有余. 符号 含义 示例 . 可以匹配任意字符,但不包含换行符'\n' Pyt.on ->Pytmon ...
随机推荐
- 【RF库XML测试】parse xml
Name:Parse XmlSource:XML <test library>Arguments:[ source | keep_clark_notation=False ]Parses ...
- Nginx(十)-- 进程模型及工作原理
1.nginx进程模型 Nginx是一个master和worker的模型.master主要用来管理worker进程,master就比作老板,worker就是打工仔,master指挥worker来做事情 ...
- Nginx(九)-- Nginx实际使用配置
1.由于在nginx中需要配置很多东西,就会使得nginx.conf配置文件过于臃肿,所以我们会将配置文件合理的切分.大体的配置依然在nginx.conf中,其他的配置会放在etc下面的目录中. 2. ...
- [Python] Python 调用 C 共享库
Linux/Unix 平台下共享库(Shared Library)文件后缀 .so:在 Windows 平台称为动态链接库(Dynamic Link Library),文件名后缀为 .dll. 利用 ...
- 中间件系列三 RabbitMQ之交换机的四种类型和属性
概述本文介绍RabbitMQ中交换机类型和属性,主要内容如下: 交换机的作用交换机的类型:Direct exchange(直连交换机).Fanout exchange(扇型交换机).Topic exc ...
- js replace replaceAll
今天因为一些原因来看这篇博文,测试了一下根本不对.replace根本没有string.replace("字符","字符")这样的写法,而是stringObjec ...
- QT之 Hello World
下载…… 我下载的Qt creater 版本为4.2.1,Qt版本为5.8.0 打开QT Creater 1. 新建项目 New Project -> Application -> Q ...
- 【Nginx系列】Nginx之location
语法: location [=|~|~*|^~] patt { } 一.分类 中括号可以不写任何参数,此时称为一般匹配 也可以写参数 因此,大类型可以分为3种 location = patt {} [ ...
- 怎样在excel中快速输入当前日期和时间
找到并启动我们的Microsoft Excel软件,如图 在excel中,我们先演示如何快速输入当前“日期”,先在一个“单元格”里面输入“Ctrl+:”(就是“Ctrl“键和“:”键的组合),效果 ...
- Elasticsearch学习之相关度评分TF&IDF
relevance score算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度 Elasticsearch使用的是 term frequency/inverse doc ...