日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构栈队列链表数组

發布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构栈队列链表数组 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄:

  • 數據結構
  • 棧(stack)
  • 隊列
  • 鏈表
  • 數組

數據結構

數據結構是什么

  • 簡單來說,數據結構就是設計數據以何種方式存儲在計算機中
  • 比如:列表,集合,與字典等都是一種數據結構
  • 程序 = 數據結構 + 算法

數據結構與數據類型

  • 數據類型:

說明:數據類型是一個值的集合和定義在此集合上一組操作(通常是增刪改查或者操作讀寫的方法)的總稱
數據類型:int、str、boolean、byte

  • 數據結構:

說明:數據以什么方式構成,如何進行存儲(數據結構是數據類型中的一種:結構類型)
數據結構:數組、棧、隊列、鏈表、樹、圖、堆、散列表等
python數據結構:列表、集合、字典、元祖

數據結構與數據類型比較

  • 數據類型的分類為:原子類型 和 結構類型
  • 原子類型 = 一種值的集合 + 定義在值集合上的一組操作。(比如:python中的int,float,字符串)
  • 結構類型 = 一種數據結構 + 定義在這種數據結構上的一組操作。(比如:python中的列表,字典,元組)
  • 數據類型=原子類型 + 結構類型
  • 注:數據類型是一個值的集合和定義在此集合上一組操作(通常是增刪改查或者操作讀寫的方法)的總稱

    棧(stack)

    棧的定義

    棧是一種數據集合,可以理解為只能在一端進行插入或刪除操作的列表

    棧的特點

    • 后進先出(last-in, first-out)

    棧的基本操作

    進棧(壓棧):push
    出棧:pop
    取棧頂:gettop

    python實現棧功能

    #! /usr/bin/env python # -*- coding: utf-8 -*-class Stack(object):def __init__(self):self.stack = [] # 初始化一個棧def push(self,item): # 入棧self.stack.append(item)def gettop(self): # 獲取棧頂元素return self.stack[-1]def pop(self): # 出棧return self.stack.pop()if __name__ == '__main__':s = Stack()s.push(1)s.push(2)print(s.stack)

    棧的使用:匹配括號是否成對出現

    def check_kuohao(s):stack = []for char in s:if char in ['(','[','{']:stack.append(char)elif char == ')':if len(stack)>0 and stack[-1] == '(':stack.pop()else:return Falseelif char == ']':if len(stack) > 0 and stack[-1] == '[':stack.pop()else:return Falseelif char == '}':if len(stack) > 0 and stack[-1] == '{':stack.pop()else:return Falseif len(stack) == 0:return Trueelse:return False print(check_kuohao('(){}{}[]')) #True

    隊列

    隊列定義

  • 隊列是一個數據集合,僅允許在列表的一端進行插入,另一端進行刪除
  • 插入的一端稱為隊尾(rear),插入動作叫進隊或入隊
  • 進行刪除的一端稱為對頭(front),刪除動作稱為出隊
  • 隊列性質:先進先出(First-in, First-out)
  • 雙向隊列:隊列的兩端都允許進行進隊和出隊操作
  • 隊列使用方法

    • 導入: from collectios import deque
    • 創建隊列:queue = deque(li)
    • 進隊: append
    • 出隊: popleft
    • 雙向隊列隊首進隊:appendleft
    • 雙向隊列隊尾出隊:pop

    python操作隊列Queue

    from queue import Queue #1. 基本FIFO隊列 先進先出 FIFO即First in First Out,先進先出 #2. maxsize設置隊列中,數據上限,小于或等于0則不限制,容器中大于這個數則阻塞,直到隊列中的數據被消掉 q = Queue(maxsize=0)#3. 寫入隊列數據 q.put(0) q.put(1) q.put(2)#4. 輸出當前隊列所有數據 print(q.queue)#5. 刪除隊列數據,并返回該數據 q.get()#6. 輸也所有隊列數據 print(q.queue)

    隊列應用場景

    • 隊列主要的功能是在多個進程間共享數據,實現業務解耦,提高效率
    • 生產者線程只需要把任務放入隊列中,消費者線程只需要到隊列中取數據進行處理

    隊列與列表區別

    列表中數據雖然是排列的,但數據被取走后還會保留,而隊列中這個容器的數據被取后將不會保留

    雙向對列原理圖

  • 環形對列:當對位指針front == Maxsize + 1 時,再進一個位置就自動到0
  • 實現方法:求余數運算
  • 隊首指針前進1: front = (front + 1)%MaxSize
  • 隊尾指針前進1:rear = (rear+1)%MaxSize
  • 隊空條件:rear == front
  • 隊滿條件:(rear+1)%MaxSize == front
  • 鏈表

    單鏈表

    注:鏈表中每個元素都是一個對象,每個對象稱為一個節點,包含有數據域key和指向下一節點的指針next,通過各個節點間的相互連接,最終串聯成一個鏈表

    python模擬鏈表數據類型

    class Node(object):def __init__(self, item,next=None):self.item = itemself.next = next l = Node(1,Node(2,Node(3,Node(4)))) print(l.item) print(l.next.item)

    單鏈表增刪改查

    #! /usr/bin/env python # -*- coding: utf-8 -*- class Node(object):def __init__(self, item):self.item = itemself.next = Noneclass DLinkList(object):def __init__(self):self._head = Nonedef is_empty(self):return self._head == Nonedef append(self, item):'''尾部追加元素'''node = Node(item)if self.is_empty():self._head = nodeelse:cur = self._headwhile cur.next != None:cur = cur.nextcur.next = nodedef add(self, item):"""頭部插入元素"""node = Node(item)if self.is_empty():self._head = node # 如果是空鏈表,將_head指向nodeelse:node.next = self._head # 將node的next指向_head的頭節點self._head = node # 將_head 指向nodedef travel(self):cur = self._headwhile cur != None:print cur.item,cur = cur.nextprint ""def remove(self, item):"""刪除元素"""if self.is_empty():returnelse:cur = self._headif cur.item == item:# 如果首節點的元素即是要刪除的元素if cur.next == None: # 如果鏈表只有這一個節點self._head = Noneelse: # 將_head指向第二個節點self._head = cur.nextreturnwhile cur != None:if cur.next.item == item:cur.next = cur.next.nextbreakcur = cur.nextdef insert(self, pos, item):"""在指定位置添加節點"""if pos <= 0:self.add(item)elif pos > (self.length() - 1):self.append(item)else:node = Node(item)cur = self._headcount = 0# 移動到指定位置的前一個位置while count < (pos - 1):count += 1cur_next = cur.next# 將node的next指向cur的下一個節點cur.next = nodenode.next = cur_nextdef length(self):"""返回鏈表的長度"""cur = self._headcount = 0while cur != None:count += 1cur = cur.nextreturn countif __name__ == '__main__':ll = DLinkList()# 1、將鏈表后面追加三個元素:1,2,3ll.append(1)ll.append(2)ll.append(3)ll.travel() # 1 2 3# 2、將鏈表頭部插入一個元素:0ll.add(0)ll.travel() # 1 2 3 ==> 0 1 2 3# 3、刪除鏈表中的元素:3ll.remove(3)ll.travel() # 0 1 2 3 ==> 0 1 2# 4、在鏈表的第2號位置插入元素:8ll.insert(2,8)ll.travel() # 0 1 2 ==> 0 8 1 2

    鏈表反轉

    #! /usr/bin/env python # -*- coding: utf-8 -*- class Node(object):def __init__(self, val):self.val = valself.next = Nonedef list_reverse(head):if head == None:return NoneL, R, cur = None, None, head # 左指針、有指針、游標while cur.next != None:L = R # 左側指針指向以前右側指針位置R = cur # 右側指針前進一位指向當前游標位置cur = cur.next # 游標每次向前進一位R.next = L # 右側指針指向左側實現反轉cur.next = R # 當跳出 while 循環時 cur(原鏈表最后一個元素) R(原鏈表倒數第二個元素)return curif __name__ == '__main__':'''原始鏈表:1 -> 2 -> 3 -> 4反轉鏈表:4 -> 3 -> 2 -> 1'''l1 = Node(1)l1.next = Node(2)l1.next.next = Node(3)l1.next.next.next = Node(4)l = list_reverse(l1)print l.val # 4 反轉后鏈表第一個值4print l.next.val # 3 第二個值3

    鏈表排序:歸并排序算法實現

    #! /usr/bin/env python # -*- coding: utf-8 -*- class ListNode(object):def __init__(self, val, next=None):self.val = valself.next = next# 歸并法: 對鏈表排序 class Solution:def sortList(self, head):if head is None or head.next is None:return headpre = headslow = head # 使用快慢指針來確定中點fast = headwhile fast and fast.next:pre = slowslow = slow.nextfast = fast.next.nextleft = headright = pre.nextpre.next = None # 從中間打斷鏈表left = self.sortList(left)right = self.sortList(right)return self.merge(left, right)def merge(self, left, right):pre = ListNode(-1)first = prewhile left and right:if left.val < right.val:pre.next = leftpre = leftleft = left.nextelse:pre.next = rightpre = rightright = right.nextif left:pre.next = leftelse:pre.next = rightreturn first.nextnode1 = ListNode(4) node2 = ListNode(3) node3 = ListNode(2) node4 = ListNode(1)node1.next = node2 node2.next = node3 node3.next = node4s = Solution() result = s.sortList(node1)while (result != None):print result.val, # 1 2 3 4result = result.next

    對python列表排序:歸并排序 對比

    #!/usr/bin/env python # -*- coding:utf-8 -*- def mergesort(seq):if len(seq) <= 1:return seqmid = int(len(seq) / 2)left = mergesort(seq[:mid])right = mergesort(seq[mid:])return merge(left, right)def merge(left, right):result = []i, j = 0, 0while i < len(left) and j < len(right):if left[i] <= right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1result += left[i:]result += right[j:]return resultif __name__ == '__main__':seq = [10,4,6,3,8,2,5,7]print mergesort(seq) # [2, 3, 4, 5, 6, 7, 8, 10]

    雙鏈表

    注:雙鏈表中每個節點有兩個指針:一個指針指向后面節點、一個指向前面節點


        
    雙鏈表增刪改查

    #! /usr/bin/env python # -*- coding: utf-8 -*- class Node(object):"""雙向鏈表節點"""def __init__(self, item):self.item = itemself.next = Noneself.prev = Noneclass DLinkList(object):"""雙向鏈表"""def __init__(self):self._head = Nonedef is_empty(self):"""判斷鏈表是否為空"""return self._head == Nonedef length(self):"""返回鏈表的長度"""cur = self._headcount = 0while cur != None:count += 1cur = cur.nextreturn countdef travel(self):"""遍歷鏈表"""cur = self._headwhile cur != None:print cur.item,cur = cur.nextprint ""def add(self, item):"""頭部插入元素"""node = Node(item)if self.is_empty():# 如果是空鏈表,將_head指向nodeself._head = nodeelse:# 將node的next指向_head的頭節點node.next = self._head# 將_head的頭節點的prev指向nodeself._head.prev = node# 將_head 指向nodeself._head = nodedef append(self, item):"""尾部插入元素"""node = Node(item)if self.is_empty():# 如果是空鏈表,將_head指向nodeself._head = nodeelse:# 移動到鏈表尾部cur = self._headwhile cur.next != None:cur = cur.next# 將尾節點cur的next指向nodecur.next = node# 將node的prev指向curnode.prev = curdef search(self, item):"""查找元素是否存在"""cur = self._headwhile cur != None:if cur.item == item:return Truecur = cur.nextreturn Falsedef insert(self, pos, item):"""在指定位置添加節點"""if pos <= 0:self.add(item)elif pos > (self.length() - 1):self.append(item)else:node = Node(item)cur = self._headcount = 0# 移動到指定位置的前一個位置while count < (pos - 1):count += 1cur = cur.next# 將node的prev指向curnode.prev = cur# 將node的next指向cur的下一個節點node.next = cur.next# 將cur的下一個節點的prev指向nodecur.next.prev = node# 將cur的next指向nodecur.next = nodedef remove(self, item):"""刪除元素"""if self.is_empty():returnelse:cur = self._headif cur.item == item:# 如果首節點的元素即是要刪除的元素if cur.next == None:# 如果鏈表只有這一個節點self._head = Noneelse:# 將第二個節點的prev設置為Nonecur.next.prev = None# 將_head指向第二個節點self._head = cur.nextreturnwhile cur != None:if cur.item == item:# 將cur的前一個節點的next指向cur的后一個節點cur.prev.next = cur.next# 將cur的后一個節點的prev指向cur的前一個節點cur.next.prev = cur.prevbreakcur = cur.nextif __name__ == "__main__":ll = DLinkList()ll.add(1)ll.add(2)# ll.append(3)# ll.insert(2, 4)# ll.insert(4, 5)# ll.insert(0, 6)# print "length:",ll.length()# ll.travel()# print ll.search(3)# print ll.search(4)# ll.remove(1)print "length:",ll.length()ll.travel()

    雙鏈表追加和遍歷

    #! /usr/bin/env python # -*- coding: utf-8 -*- class Node(object):def __init__(self, item):self.item = itemself.next = Noneself.prev = Noneclass DLinkList(object):def __init__(self):self._head = Nonedef is_empty(self):return self._head == Nonedef append(self, item):node = Node(item)if self.is_empty():self._head = nodeelse:cur = self._headwhile cur.next != None:cur = cur.nextcur.next = nodenode.prev = curdef travel(self):cur = self._headwhile cur != None:print cur.item,cur = cur.nextif __name__ == '__main__':ll = DLinkList()ll.append(1)ll.append(2)ll.append(3)# print ll._head.item # 打印第一個元素:1# print ll._head.next.item # 打印第二個元素:2# print ll._head.next.next.item # 打印第三個元素:3ll.travel() # 1 2 3

    數組

    數組定義

  • 所謂數組,就是相同數據類型的元素按一定順序排列的集合
  • 在Java等其他語言中并不是所有的數據都能存儲到數組中,只有相同類型的數據才可以一起存儲到數組中
  • 因為數組在存儲數據時是按順序存儲的,存儲數據的內存也是連續的,所以他的特點就是尋址讀取數據比較容易,插入和刪除比較困難
  • python中list與數組比較

    • python中的list是python的內置數據類型,list中的數據類不必相同的,而array的中的類型必須全部相同
    • 在list中的數據類型保存的是數據的存放的地址,簡單的說就是指針,并非數據
    • 否則這樣保存一個list就太麻煩了,例如list1=[1,2,3,‘a’]需要4個指針和四個數據,增加了存儲和消耗cpu

    詳細參考這個鏈接

    總結

    以上是生活随笔為你收集整理的数据结构栈队列链表数组的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。