基于python实现模拟数据结构模型


Posted in Python onJune 12, 2020

模拟栈

  • Stack() 创建一个空的新栈。 它不需要参数,并返回一个空栈。
  • push(item)将一个新项添加到栈的顶部。它需要 item 做参数并不返回任何内容。
  • pop() 从栈中删除顶部项。它不需要参数并返回 item 。栈被修改。
  • peek() 从栈返回顶部项,但不会删除它。不需要参数。 不修改栈。
  • isEmpty() 测试栈是否为空。不需要参数,并返回布尔值。
  • size() 返回栈中的 item 数量。不需要参数,并返回一个整数。
class Stack():
  def __init__(self):
    self.items = []
  def push(self,item):
    self.items.append(item)
  def pop(self):
    return self.items.pop()
  def peek(self):
    return len(self.items) - 1
  def isEmpty(self):
    return self.items == []
  def size(self):
    return len(self.items)
s = Stack()
s.push(1)
s.push(2)
s.push(3)
print(s.pop())
print(s.pop())
print(s.pop())
print(s.isEmpty())

模拟队列

  • Queue() 创建一个空的新队列。 它不需要参数,并返回一个空队列。
  • enqueue(item) 将新项添加到队尾。 它需要 item 作为参数,并不返回任何内容。
  • dequeue() 从队首移除项。它不需要参数并返回 item。 队列被修改。
  • isEmpty() 查看队列是否为空。它不需要参数,并返回布尔值。
  • size() 返回队列中的项数。它不需要参数,并返回一个整数。
class Queue():
  def __init__(self):
    self.items = []
  def enqueue(self,item):
    self.items.insert(0,item)
  def dequeue(self):
    return self.items.pop()
  def isEmpty(self):
    return self.items == []
  def size(self):
    return len(self.items)
q = Queue()
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
print(q.dequeue())
print(q.dequeue())
print(q.dequeue())

案例:烫手山芋

烫手山芋游戏介绍:6个孩子围城一个圈,排列顺序孩子们自己指定。第一个孩子手里有一个烫手的山芋,需要在计时器计时1秒后将山芋传递给下一个孩子,依次类推。规则是,在计时器每计时7秒时,手里有山芋的孩子退出游戏。该游戏直到剩下一个孩子时结束,最后剩下的孩子获胜。请使用队列实现该游戏策略,排在第几个位置最终会获胜。

准则:队头孩子的手里永远要有山芋。

queue = Queue()
kids = ['A','B','C','D','E','F']
#将六个孩子添加到队列中,A是队头位置的孩子
for kid in kids:
  queue.enqueue(kid)

while queue.size() > 1:
  #在7秒之内山芋会被传递6次
  for i in range(6):
    kid = queue.dequeue()
    queue.enqueue(kid)
  queue.dequeue()

print('获胜者为:',queue.dequeue())

模拟双端队列

同同列相比,有两个头部和尾部。可以在双端进行数据的插入和删除,提供了单数据结构中栈和队列的特性

  • Deque() 创建一个空的新deque。它不需要参数,并返回空的deque。
  • addFront(item) 将一个新项添加到deque的首部。它需要item参数并不返回任何内容。
  • addRear(item) 将一个新项添加到deque的尾部。它需要item参数并不返回任何内容。
  • removeFront() 从deque中删除首项。它不需要参数并返回item。deque被修改。
  • removeRear() 从deque中删除尾项。它不需要参数并返回item。deque被修改。
  • isEmpty() 测试deque是否为空。它不需要参数,并返回布尔值。
  • size() 返回deque中的项数。它不需要参数,并返回一个整数。

案例:回文检查

回文是一个字符串,读取首尾相同的字符,例如,radar toot madam。

def isHuiWen(s):
  ex = True
  q = Dequeue()
  # 将字符串的每一个字符添加到双端队列中
  for ch in s:
    q.addFront(ch)
  for i in range(len(s) // 2):
    font = q.removeFront()
    rear = q.removeRear()
    if font != rear:
      ex = False
      break
  return ex

模拟链表

  • . is_empty():链表是否为空
  • . length():链表长度
  • . travel():遍历整个链表
  • . add(item):链表头部添加元素
  • . append(item):链表尾部添加元素
  • . insert(pos, item):指定位置添加元素
  • . remove(item):删除节点
  • . search(item):查找节点是否存在

结点对象:

class Node():
  def __init__(self,item):
    self.item = item
    self.next = None

链表对象:

class Link():
  #构建出一个空的链表
  def __init__(self):
    self._head = None #永远指向链表中的头节点
    #想链表的头部插入节点
  def add(self,item):
    node = Node(item)
    node.next = self._head
    self._head = node

  def travel(self):  
    cur = self._head
    #链表为空则输出‘链表为空'
    if self._head == None:
      print('链表为空!')
    while cur:
      print(cur.item)
      cur = cur.next
  def isEmpty(self):
    return self._head == None
  def length(self):
    cur = self._head
    count = 0
    while cur:
      count += 1
      cur = cur.next
    return count     
  def search(self,item):
    cur = self._head
    find = False
    while cur:
      if cur.item == item:
        find = True
        break
      cur = cur.next
    return find

  def append(self,item):
    node = Node(item)
    #链表为空的情况
    if self._head == None:
      self._head = node
      return

    cur = self._head #头节点
    pre = None #cur的前一个节点
    while cur:
      pre = cur
      cur = cur.next
    pre.next = node

  def insert(self,pos,item):
    node = Node(item)

    if pos < 0 or pos > self.length():
      print('重新给pos赋值!!!')
      return

    cur = self._head
    pre = None

    for i in range(pos):
      pre = cur
      cur = cur.next
    pre.next = node
    node.next = cur
  def remove(self,item):
    cur = self._head
    pre = None

    if self._head == None:#链表为空
      print('链表为空,没有可删除的节点!!1')
      return
    #删除的是第一个节点的情况
    if self._head.item == item:
      self._head = self._head.next
      return

    #删除的是非第一个节点的情况
    while cur:
      pre = cur
      cur = cur.next
      if cur.item == item:
        pre.next = cur.next
        return

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
最近Python有点火? 给你7个学习它的理由!
Jun 26 Python
Python实现发送QQ邮件的封装
Jul 14 Python
python读取图片并修改格式与大小的方法
Jul 24 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
Django错误:TypeError at / 'bool' object is not callable解决
Aug 16 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
python利用paramiko实现交换机巡检的示例
Sep 22 Python
Python 实现PS滤镜中的径向模糊特效
Dec 03 Python
详解python3类型注释annotations实用案例
Jan 20 Python
理解深度学习之深度学习简介
Apr 14 Python
Python基础之字符串格式化详解
Apr 21 Python
Python-for循环的内部机制
Jun 12 #Python
Python Scrapy图片爬取原理及代码实例
Jun 12 #Python
Python Scrapy多页数据爬取实现过程解析
Jun 12 #Python
Selenium自动化测试工具使用方法汇总
Jun 12 #Python
Python使用socketServer包搭建简易服务器过程详解
Jun 12 #Python
Django之腾讯云短信的实现
Jun 12 #Python
python相对企业语言优势在哪
Jun 12 #Python
You might like
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
PHP 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
2015/04/27 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
javascript中的几个运算符
2007/06/29 Javascript
js关闭当前页面(窗口)的几种方式总结
2013/03/05 Javascript
JavaScript中this的使用详解
2013/11/08 Javascript
js的Prototype属性解释及常用方法
2014/05/08 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
2015/03/03 Javascript
JavaScript中使用自然对数ln的方法
2015/06/14 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
jQuery事件对象的属性和方法详解
2017/09/09 jQuery
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
security.js实现的RSA加密功能示例
2018/06/06 Javascript
使用layui 渲染table数据表格的实例代码
2018/08/19 Javascript
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
使用typescript快速开发一个cli的实现示例
2020/12/09 Javascript
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
python实现超市扫码仪计费
2018/05/30 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
Flask框架实现给视图函数增加装饰器操作示例
2018/07/16 Python
python字典一键多值实例代码分享
2019/06/14 Python
对Python中小整数对象池和大整数对象池的使用详解
2019/07/09 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
Python列表元素删除和remove()方法详解
2021/01/04 Python
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
泰坦健身器材:Titan Fitness
2018/02/13 全球购物
《邮票齿孔的故事》教学反思
2014/02/22 职场文书
运动会拉拉队口号
2014/06/09 职场文书
妈妈活动方案
2014/08/15 职场文书
升学宴答谢词
2015/01/05 职场文书