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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python__数据结构与算法——表、栈、队列

發(fā)布時間:2025/3/19 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python__数据结构与算法——表、栈、队列 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

一、表

二、棧(后進先出)

三、隊列(先進先出)


數(shù)據(jù)結(jié)構(gòu)使用來描述一種或多種數(shù)據(jù)元素之間的特定關(guān)系,算法是程序設(shè)計中對數(shù)據(jù)操作的描述,數(shù)據(jù)結(jié)構(gòu)和算法組成了程序。對于簡單的任務(wù),只要使用編程語言提供的基本數(shù)據(jù)類型就足夠了;而對于較復雜的任務(wù),就需要使用基本的數(shù)據(jù)類型來構(gòu)造出更加復雜的數(shù)據(jù)結(jié)構(gòu)。

表、堆棧和隊列都是基本的線性數(shù)據(jù)結(jié)構(gòu)。由于 Python 具有良好的數(shù)據(jù)結(jié)構(gòu),因此其列表可以當做表來使用,而且列表的某些特性與鏈表相似,因此,在 Python 中,表的實現(xiàn)非常簡單。對于棧和隊列,則可以自己編寫腳本來構(gòu)建。

一、表

表是最基本的數(shù)據(jù)結(jié)構(gòu),在 Python 中可以使用列表來創(chuàng)建表。而在 C 語言中,一般使用數(shù)組來創(chuàng)建表。使用數(shù)組所創(chuàng)建的表,在對表中元素進行插入和刪除操作時開銷較大。當插入一個元素時,要先將該元素后的所有元素,從最后一個元素開始,依次向后移動一個位置。完成元素移動后,再將元素插入到數(shù)組中。同樣,要刪除表中的元素時,首先刪除元素,然后將位于該元素之后的元素從前向后,依次向前移動一個位置。

如果一個表中含有的元素較多,而要進行插入或刪除的位置又比較靠近表的前端,則移動表中元素的操作將耗費大量的時間。為了減少插入或刪除元素的線性開銷,于是就出現(xiàn)了使用鏈表代替表。在 C 語言中,鏈表中不僅保存了數(shù)據(jù),還保存了指向下一個元素的指針,如圖 1 所示。當進行插入操作時,要先將位于插入元素前的元素的指針賦值給插入元素。完成賦值后再將插入元素的地址賦值給位于其前面的元素,如圖 2 所示。當刪除元素時,只需將要刪除元素的指針賦值給其前面的元素即可,如圖 3 所示。

使用鏈表,可以降低插入、刪除元素的線性開銷。然而,由于鏈表中不僅存儲了數(shù)據(jù),而且還保存了指向下一個元素的指針,因此使用鏈表將占用更大的存儲空間。

而在 Python 中,列表本身就提供了插入和刪除操作。因此,在 Python 中,列表也可以充當鏈表使用,而不用自己另外編寫腳本來構(gòu)建。

還有一種鏈表,稱之為雙向鏈表,如圖 4 所示。雙向鏈表中不僅保存了指向下一元素地址的指針,而且還保存了指向上一個元素地址的指針。相對于單向鏈表,雙向鏈表需要占用更多的存儲空間,但使用雙向鏈表可以完成正序和倒序掃描鏈表。

二、棧(后進先出)

桟可以看做在同一位置上進行插入和刪除的表,這個位置一般稱為棧頂。棧的基本操作是進棧和出棧,棧可以看做一個容器,如圖 5 所示,先入棧的數(shù)據(jù)保存在容器底部,后入棧的數(shù)據(jù)保存在容器頂部。出棧的時候,后入棧的數(shù)據(jù)先出,而先入棧的數(shù)據(jù)后出,因此棧有一個特性叫做后進先出(LIFO)。

在 Python 中,仍然可以使用列表來存儲堆棧數(shù)據(jù)。通過創(chuàng)建一個堆棧類,實現(xiàn)對堆棧進行操作的方法。例如,進棧 PUSH 方法、出棧 POP 方法,編寫檢查棧是否為滿棧,或者是否為空棧的方法,等等。

下面所示的 pystack.py 在 Python 中創(chuàng)建了一個簡單的堆棧結(jié)構(gòu)。

# -*- coding:UTF-8 -*- # file: pystack.pyclass PyStack: # 堆棧類def __init__(self, size=20):self.stack = [] # 堆棧列表self.size = size # 堆棧大小self.top = -1 # 堆頂位置def setSize(self, size): # 設(shè)置堆棧大小self.size = sizedef push(self, element): # 元素進棧if self.isFull():raise StackException('PyStackOverflow') # 如果棧滿則引發(fā)異常else:self.stack.append(element)self.top = self.top + 1def pop(self): # 元素出棧if self.isEmpty():raise StackException('PyStackUnderflow') # 如果棧為空則引發(fā)異常else:element = self.stack[-1]self.top = self.top - 1del self.stack[-1]return elementdef Top(self): # 后面需要引用return self.top # 獲取棧頂位置def empty(self): # 清空棧self.stack = []self.top = -1def isEmpty(self): # 是否為空棧if self.top == -1:return Trueelse:return Falsedef isFull(self): # 是否為滿棧if self.top == self.size - 1:return Trueelse:return Falseclass StackException(Exception): # 自定義異常類def __init__(self, data):self.data = datadef __str__(self):return self.dataif __name__ == '__main__':stack = PyStack() # 創(chuàng)建棧for i in range(10):stack.push(i) # 元素進棧print(stack.Top()) # 輸出棧頂位置for i in range(10):print(stack.pop()) # 元素出棧stack.empty() # 清空棧for i in range(21):stack.push(i) # 此處將引發(fā)異常

運行 pystack.py 腳本后,輸出內(nèi)容如下(異常的位置不固定)。

三、隊列(先進先出)

隊列和棧的結(jié)構(gòu)類似,如圖 6 所示,不同的是,隊列的出隊操作是在隊首元素進行的刪除操作。因此對于隊列而言,先入隊的元素將先出隊。因此隊列的特性可以稱之為先進先出(FIFO)。

和堆棧類似,在 Python 中同樣可以使用列表來構(gòu)建一個隊列,并完成對隊列的操作。下面所示的 pyqueue.py 腳本構(gòu)建了一個簡單的隊列。

# -*- coding:UTF-8 -*- # file: pyqueue.pyclass PyQueue: # 創(chuàng)建隊列def __init__(self, size = 20):self.queue = [] # 隊列self.size = size # 隊列大小self.end = -1 # 隊尾def setSize(self, size): # 設(shè)置隊列大小self.size = sizedef In(self, element): # 入隊if self.end < self.size - 1:self.queue.append(element)self.end = self.end + 1else:raise QueueException('PyQueueFull') # 如果隊列滿則引發(fā)異常def Out(self): # 出隊if self.end != -1:element = self.queue[0]self.queue = self.queue[1:]self.end = self.end - 1return elementelse:raise QueueException('PyQueueEmpty') # 如果隊列為空則引發(fā)異常def End(self): # 輸出隊尾return self.enddef empty(self): # 清除隊列self.queue = []self.end = -1class QueueException(Exception): # 自定義異常類def __init__(self, data):self.data = datadef __str__(self):return self.dataif __name__ == '__main__':queue = PyQueue()for i in range(10):queue.In(i) # 元素入隊print(queue.End())for i in range(10):print(queue.Out()) # 元素出隊for i in range(20):queue.In(i) # 元素入隊queue.empty() # 清空隊列for i in range(20):print(queue.Out()) # 此處將引發(fā)異常

運行 pyqueue.py 腳本后,輸出內(nèi)容如下(異常的位置不固定)。

總結(jié)

以上是生活随笔為你收集整理的Python__数据结构与算法——表、栈、队列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。