基于python實現模擬數據結構模型

 更新時間:2020-06-14 01:15:38   作者:佚名   我要評論(0)

模擬棧



Stack() 創建一個空的新棧。 它不需要參數,并返回一個空棧。
push(item)將一個新項添加到棧的頂部。它需要 item 做參數并不返回任何內容。
pop()

模擬棧

  • 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+poco+夜神模擬器進行自動化測試實例
  • Python爬蟲實現模擬點擊動態頁面
  • python模擬點擊網頁按鈕實現方法
  • Python 寫了個新型冠狀病毒疫情傳播模擬程序
  • python模擬預測一下新型冠狀病毒肺炎的數據
  • 如何使用python實現模擬鼠標點擊
  • python爬蟲-模擬微博登錄功能

相關文章

  • 基于python實現模擬數據結構模型

    基于python實現模擬數據結構模型

    模擬棧 Stack() 創建一個空的新棧。 它不需要參數,并返回一個空棧。 push(item)將一個新項添加到棧的頂部。它需要 item 做參數并不返回任何內容。 pop()
    2020-06-14
  • python新手學習使用庫

    python新手學習使用庫

    本文主要介紹下如何使用第三方庫。 1. 理解第三方庫 Python相當于一個手機,第三方庫相當于手機里各種各樣的APP。 當我們想搭建網站時,可以選擇功能全面的Django、
    2020-06-14
  • Python數據可視化圖實現過程詳解

    Python數據可視化圖實現過程詳解

    python畫分布圖代碼示例: # encoding=utf-8 import matplotlib.pyplot as plt from pylab import * # 支持中文 mpl.rcParams['font.sans-serif'] = ['SimHei']
    2020-06-14
  • keras的siamese(孿生網絡)實現案例

    keras的siamese(孿生網絡)實現案例

    代碼位于keras的官方樣例,并做了微量修改和大量學習&#63;。 最終效果: import keras import numpy as np import matplotlib.pyplot as plt import random f
    2020-06-14
  • 為什么說python適合寫爬蟲

    為什么說python適合寫爬蟲

    抓取網頁本身的接口 相比與其他靜態編程語言,如java,c#,C++,python抓取網頁文檔的接口更簡潔;相比其他動態腳本語言,如perl,shell,python的urllib2包提供了較
    2020-06-14
  • keras 讀取多標簽圖像數據方式

    keras 讀取多標簽圖像數據方式

    我所接觸的多標簽數據,主要包括兩類: 1、一張圖片屬于多個標簽,比如,data:一件藍色的上衣圖片.jpg,label:藍色,上衣。其中label包括兩類標簽,label1第一類:上
    2020-06-14
  • keras實現基于孿生網絡的圖片相似度計算方式

    keras實現基于孿生網絡的圖片相似度計算方式

    我就廢話不多說了,大家還是直接看代碼吧! import keras from keras.layers import Input,Dense,Conv2D from keras.layers import MaxPooling2D,Flatten,Convolu
    2020-06-14
  • Python matplotlib 繪制雙Y軸曲線圖的示例代碼

    Python matplotlib 繪制雙Y軸曲線圖的示例代碼

    Matplotlib簡介 Matplotlib是非常強大的python畫圖工具 Matplotlib可以畫圖線圖、散點圖、等高線圖、條形圖、柱形圖、3D圖形、圖形動畫等。 Matplotlib安裝
    2020-06-14
  • 簡單了解Python變量作用域正確使用方法

    簡單了解Python變量作用域正確使用方法

    在寫代碼的時候,免不了要使用變量。但程序中的一個變量并不一定是在哪里都可以被使用,根據情況不同,會有不同的“有效范圍”。 看這樣一段代碼: def func(x):
    2020-06-14
  • python相對企業語言優勢在哪

    python相對企業語言優勢在哪

    語言的問題,見仁見智,基本上屬于信仰,無法強求一致。不過作為Python的愛好者,我想在這里為Python做一點辯護。 就語法來看,Python比Perl優美得多。Perl里面充滿
    2020-06-14

最新評論

买宝宝用品赚钱吗 甘肃11选五任五遗漏号 股票资配公司? 大乐透2020年春节休市时间 07年免费股票分析软件 广西快乐十分总和单双 七乐彩手机怎么投注 我爱配资网就选尚牛在线 一定牛11选五走势图 极速赛车大小单双技巧 甘肃快三计划免费版 广东11选五预测计划 山东十一选五一定牛遗漏表 云南时时彩任选三玩法 忠旺股票 河北快3开奖结果和 快3正规平台