逻辑数据结构包括:线形结构、树形结构、图形结构、集合;存储结构包括:顺序存储、链式存储、索引存储、散列存储。

同一种逻辑结构可以有四种存储结构,不同的存储结构增、删、查、改的速度不同。逻辑结构与存储结构排列组合,就得到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(推荐)

  1. class Stack(list):
  2. def __init__(self):
  3. self.__stack = []
  4.  
  5. def is_empty(self):
  6. return not bool(len(self))
  7.  
  8. def push(self,data):
  9. self.__stack.append(data)
  10.  
  11. def pop(self):
  12. if len(self.__stack)>0:
  13. return self.__stack.pop()
  14.  
  15. def peek(self):
    if len(self.__stack)>0:
  16. return self.__stack[-1]
  17.  
  18. def get_length(self):
  19. return len(self.__stack)

Stack类--实现2(不建议使用)

  1. class Stack(list):
  2. def is_empty(self):
  3. return not bool(len(self))
  4.  
  5. def push(self,data):
  6. self.append(data)
  7.  
  8. def pop(self):
  9. if len(self)>0:
  10. return self.pop()
  11.  
  12. def peek(self):
  13. if len(self)>0:
  14. return self[-1]
  15.  
  16. def get_length(self):
  17. return len(self)

Stack类--实现3(链式存储,不建议使用)

  1. class Node(object):
  2. def __init__(self,data):
  3. self.data = data
  4. self.next = None
  5.  
  6. class Stack(object):
  7. def __init__(self,head_node):
  8. self.top = head_node
  9. self.bottom = head_node
  10.  
  11. def push(self,node):
  12. node.next = self.top
  13. self.top = node
  14.  
  15. def pop(self):
  16. if self.top == None:
  17. return None
  18. else:
  19. key = self.top
  20. self.top = self.top.next
  21. if self.top == None:
  22. self.bottom = None
  23. return key
  24.  
  25. s = Stack(Node(12))
  26. s.push(Node(13))
  27. s.push(Node(15))
  28. s.push(Node(18))
  29. s.push(Node(2))
  30. while True:
  31. a = s.pop()
  32. if a != None:
  33. print a.data
  34. continue
  35. else:
  36. break

Queue类--实现1(推荐)

  1. class Queue(object):
  2. def __init__(self):
  3. self.__queue = []
  4.  
  5. def is_empty(self):
  6. return not bool(len(self.__queue))
  7.  
  8. def peek(self):
    if len(self.__queue)>0:
  9. return self.__stack[0]
  10.  
  11. def enqueue(self,node):
  12. self.__queue.append(node)
  13.  
  14. def dequeue(self):
  15. if len(self.__queue)>0:
  16. return self.__queue.pop(0)
  17.  
  18. def get_length(self):
  19. return len(self.__queue)

Queue类--实现2(不建议使用)

  1. class Queue(list):
  2. def is_empty(self):
  3. return not bool(len(self))
  4.  
  5. def peek(self):
    if len(self)>0
  6. return self[0]
  7.  
  8. def enqueue(self,node):
  9. self.append(node)
  10.  
  11. def dequeue(self,node):
  12. if len(self)>0:
  13. return self.pop(0)
  14.  
  15. def get_length(self):
  16. return len(self)

BST类(二叉树类)

我们一般很少用一般二叉树,而是用进一步约束的二叉树,如二叉搜索树、红黑树等,这些树是一般二叉树的子类,

所以二叉树有的方法,这些方法都可以有。

  1. class Node(object):
  2. def __init__(self,data):
  3. self.data = data
  4. self.__left = None
  5. self.__right = None
  6. self.__parent = None
  7.  
  8. @property
  9. def left(self):
  10. return self.__left
  11.  
  12. @left.setter
  13. def left(self,node):
  14. if node is None or type(node) is Node:
  15. self.__left = node
  16. if type(node) is Node:
  17. node.parent = self
  18. else:
  19. raise Exception,'left node must be None or Node type'
  20.  
  21. @property
  22. def right(self):
  23. return self.__right
  24.  
  25. @right.setter
  26. def right(self,node):
  27. if node is None or type(node) is Node:
  28. self.__right = node
  29. if type(node) is Node:
  30. node.parent = self
  31. else:
  32. raise Exception,'right node must be None or Node type'
  33.  
  34. @property
  35. def parent(self):
  36. return self.__parent
  37.  
  38. @parent.setter
  39. def parent(self,node):
  40. if node is None or type(node) is Node:
  41. self.__parent = node
  42. else:
  43. raise Exception,'parent node must be None or Node type'
  44.  
  45. class BST(object):
  46. def __init__(self):
  47. self.__root = None
  48.  
  49. @property
  50. def root(self):
  51. return self.__root
  52.  
  53. @root.setter
  54. def root(self,node):
  55. if node is None or type(node) is Node:
  56. self.__root = node
  57. if type(node) is Node:
  58. node.parent = None
  59. else:
  60. raise Exception,'parent node must be None or Node type'
  61.  
  62. def pre_order(self,node):
  63. #递归结束点
  64. if node == None:
  65. return []
  66. #分支结点
  67. data = [node.data]
  68. left = self.pre_order(node.left)
  69. right = self.pre_order(node.right)
  70. return data +left +right
  71.  
  72. def in_order(self,node):
  73. if node == None:
  74. return []
  75.  
  76. left = self.pre_order(node.left)
  77. data = [node.data]
  78. right = self.pre_order(node.right)
  79. return left + data + right
  80.  
  81. def post_order(self,node):
  82. if node == None:
  83. return []
  84.  
  85. left = self.pre_order(node.left)
  86. right = self.pre_order(node.right)
  87. data = [node.data]
  88. return left + right + data
  89.  
  90. #查找以node为根结节的树的最大关键值节点
  91. def find_max(self,node):
  92. if node == None:
  93. return None
  94. p = node
  95. while True:
  96. if p.right != None:
  97. p = p.right
  98. continue
  99. else:
  100. break
  101. return p
  102.  
  103. def find_min(self,node):
  104. if node == None:
  105. return None
  106. p = node
  107. while True:
  108. if p.left != None:
  109. p = p.left
  110. continue
  111. else:
  112. break
  113. return p
  114.  
  115. def search(self,node,key):
  116. # 跟二分查找的递归方式非常像
  117. #结束点
  118. if node == None:
  119. return None
  120.  
  121. #分支节点
  122. if key == node.data:
  123. return node
  124. if key > node.data:
  125. return self.search(node.right,key)
  126. else:
  127. return self.search(node.left,key)
  128.  
  129. def insert(self,root,new_node):
  130. #结束点
  131. if new_node.data > root.data:
  132. if root.right == None:
  133. root.right = new_node
  134. return True
  135. if new_node.data == root.data:
  136. return False
  137. if new_node.data < root.data:
  138. if root.left == None:
  139. root.left = new_node
  140. return True
  141.  
  142. #分支节点
  143. if new_node.data > root.data:
  144. if root.right != None:
  145. branch_ret = self.insert(root.right,new_node)
  146. if new_node.data < root.data:
  147. if root.left != None:
  148. branch_ret = self.insert(root.left,new_node)
  149. return branch_ret
  150.  
  151. def delete(self,node):
  152. #这个方法比较繁琐,有空再写
  153. pass

Python实现常用的逻辑数据结构的更多相关文章

  1. python 下的数据结构与算法---2:大O符号与常用算法和数据结构的复杂度速查表

    目录: 一:大O记法 二:各函数高阶比较 三:常用算法和数据结构的复杂度速查表 四:常见的logn是怎么来的 一:大O记法 算法复杂度记法有很多种,其中最常用的就是Big O notation(大O记 ...

  2. Python实现常用的数据结构

    Python中的数据结构   #巧用Python列表特性实现特定数据结构 #栈实现stack = []stack.push(x)stack.pop()stack[-1] #队列实现from colle ...

  3. Python实现常用排序算法

    Python实现常用排序算法 冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...

  4. 【转】python 历险记(四)— python 中常用的 json 操作

    [转]python 历险记(四)— python 中常用的 json 操作 目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编 ...

  5. python 历险记(四)— python 中常用的 json 操作

    目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编码和解码? 常用的 json 操作有哪些? json 操作需要什么库? 如何 ...

  6. Python学习(四)数据结构(概要)

    Python 数据结构 本章介绍 Python 主要的 built-type(内建数据类型),包括如下: Numeric types          int float Text Sequence ...

  7. python教程(二)·数据结构初探

    这一节,我来简单讲讲python自带的数据结构. 列表(list) 列表是常用的python数据结构,类似于C语言的数组,用来存储多个元素,与之不同的是,C语言的数组中的元素的类型是相同的,而列表可以 ...

  8. Python 基础 常用运算符

    Python 基础 常用运算符 计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算术运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算. 今天我们暂只学习 算术运算. ...

  9. python之常用正则表达式

    以下整理python中常用的正则符号,相信能够熟悉掌握这些正则符号,大部分字符串处理将会游刃有余. 符号 含义 示例 . 可以匹配任意字符,但不包含换行符'\n' Pyt.on ->Pytmon ...

随机推荐

  1. 【RF库XML测试】parse xml

    Name:Parse XmlSource:XML <test library>Arguments:[ source | keep_clark_notation=False ]Parses ...

  2. Nginx(十)-- 进程模型及工作原理

    1.nginx进程模型 Nginx是一个master和worker的模型.master主要用来管理worker进程,master就比作老板,worker就是打工仔,master指挥worker来做事情 ...

  3. Nginx(九)-- Nginx实际使用配置

    1.由于在nginx中需要配置很多东西,就会使得nginx.conf配置文件过于臃肿,所以我们会将配置文件合理的切分.大体的配置依然在nginx.conf中,其他的配置会放在etc下面的目录中. 2. ...

  4. [Python] Python 调用 C 共享库

    Linux/Unix 平台下共享库(Shared Library)文件后缀 .so:在 Windows 平台称为动态链接库(Dynamic Link Library),文件名后缀为 .dll. 利用 ...

  5. 中间件系列三 RabbitMQ之交换机的四种类型和属性

    概述本文介绍RabbitMQ中交换机类型和属性,主要内容如下: 交换机的作用交换机的类型:Direct exchange(直连交换机).Fanout exchange(扇型交换机).Topic exc ...

  6. js replace replaceAll

    今天因为一些原因来看这篇博文,测试了一下根本不对.replace根本没有string.replace("字符","字符")这样的写法,而是stringObjec ...

  7. QT之 Hello World

    下载……   我下载的Qt creater 版本为4.2.1,Qt版本为5.8.0 打开QT Creater 1. 新建项目 New Project -> Application -> Q ...

  8. 【Nginx系列】Nginx之location

    语法: location [=|~|~*|^~] patt { } 一.分类 中括号可以不写任何参数,此时称为一般匹配 也可以写参数 因此,大类型可以分为3种 location = patt {} [ ...

  9. 怎样在excel中快速输入当前日期和时间

    找到并启动我们的Microsoft Excel软件,如图   在excel中,我们先演示如何快速输入当前“日期”,先在一个“单元格”里面输入“Ctrl+:”(就是“Ctrl“键和“:”键的组合),效果 ...

  10. Elasticsearch学习之相关度评分TF&IDF

    relevance score算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度 Elasticsearch使用的是 term frequency/inverse doc ...