基于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读取TXT到数组及列表去重后按原来顺序排序的方法
Jun 26 Python
python实现发送邮件及附件功能
Mar 02 Python
python实现简单点对点(p2p)聊天
Sep 13 Python
python实现微信接口(itchat)详细介绍
Oct 23 Python
使用python 爬虫抓站的一些技巧总结
Jan 10 Python
Python中应该使用%还是format来格式化字符串
Sep 25 Python
浅谈Django+Gunicorn+Nginx部署之路
Sep 11 Python
python+opencv3生成一个自定义纯色图教程
Feb 19 Python
Python新手学习函数默认参数设置
Jun 03 Python
Python单元测试及unittest框架用法实例解析
Jul 09 Python
python 如何读、写、解析CSV文件
Mar 03 Python
仅用几行Python代码就能复制她的U盘文件?
Jun 26 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
dedecms采集中可以过滤多行代码的正则表达式
2007/03/17 PHP
php模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
简单JS代码压缩器
2006/10/12 Javascript
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
jquery动态改变form属性提交表单
2014/06/03 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
js通过指定下标或指定元素进行删除数组的实例
2017/01/12 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
2018/09/28 Javascript
NestJs 静态目录配置详解
2019/03/12 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
python脚本实现分析dns日志并对受访域名排行
2014/09/18 Python
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
Python解析json文件相关知识学习
2016/03/01 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
Python numpy.array()生成相同元素数组的示例
2018/11/12 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
python三引号如何输入
2020/07/06 Python
DNA基因检测和分析:23andMe
2019/05/01 全球购物
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
C#面试常见问题
2013/02/25 面试题
升国旗仪式主持词
2014/03/19 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
民主评议党员总结
2014/10/20 职场文书
护士先进个人总结
2015/02/13 职场文书
学术会议领导致辞
2015/07/29 职场文书
Python if else条件语句形式详解
2022/03/24 Python
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏
Shell中的单中括号和双中括号的用法详解
2022/12/24 Servers