網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
1、隊(duì)列
隊(duì)列是一種遵循先進(jìn)先出(FIFO)原則的數(shù)據(jù)結(jié)構(gòu)。
可以使用數(shù)組實(shí)現(xiàn)隊(duì)列的基本操作。當(dāng)進(jìn)行入隊(duì)操作的時(shí)候,即在隊(duì)列尾部插入一個(gè)元素,由于需要將所有元素向后移動(dòng)一個(gè)位置,因此添加操作的時(shí)間復(fù)雜度是O(n);
當(dāng)進(jìn)行出隊(duì)操作的時(shí)候,只需要在隊(duì)頭移除一個(gè)元素,其他元素的序號(hào)不變,因此移除操作的時(shí)間復(fù)雜度是O(1)。
使用Python數(shù)組實(shí)現(xiàn)隊(duì)列源碼:
class Queue:
def __init__(self):
self.items = []
def is_empty(self):
return self.items == []
#
def enqueue(self, item):
self.items.insert(0, item)
#
def dequeue(self):
return self.items.pop()
def size(self):
return len(self.items)
2、使用隊(duì)列解決約瑟夫斯問(wèn)題
弗拉維奧·約瑟夫斯是公元1世紀(jì)著名的歷史學(xué)家。相傳,約瑟夫斯當(dāng)年和39個(gè)戰(zhàn)友在山洞中對(duì)抗羅馬軍隊(duì)。眼看著即將失敗,他們決定舍生取義。于是,他們圍成一圈,從某個(gè)人開(kāi)始,按順時(shí)針?lè)较驓⒌舻?人。約瑟夫斯同時(shí)也是卓有成就的數(shù)學(xué)家。據(jù)說(shuō),他立刻找到了自己應(yīng)該站的位置,從而使自己活到了最后。當(dāng)只剩下他時(shí),約瑟夫斯加入了羅馬軍隊(duì),而不是自 殺。
這個(gè)故事有很多版本,有的說(shuō)是每隔兩個(gè)人,有的說(shuō)最后一個(gè)人可以騎馬逃跑。不管如何,問(wèn)題都是一樣的。
約瑟夫斯問(wèn)題等價(jià)于一個(gè)兒童游戲:傳土豆。
在這個(gè)游戲中,孩子們圍成一圈,并依次盡可能快地傳遞一個(gè)土豆,在某個(gè)時(shí)刻,大家停止傳遞,此時(shí)手里有土豆的孩子就得退出游戲。重復(fù)上述過(guò)程,直到只剩下一個(gè)孩子。
import my_queue
def hotPotato(namelist, num):
queue = my_queue.Queue()
for name in namelist:
queue.enqueue(name)
while queue.size() > 1:
for i in range(num):
queue.enqueue(queue.dequeue())
queue.dequeue()
return queue.dequeue()
print(hotPotato([1, 2, 3, 4, 5, 6], 7))
執(zhí)行過(guò)程如下,最終輸出結(jié)果為 3 。
234561
345612
456123
561234
654321
543216
432165
43216 彈出4
3216 彈出3
3、雙端隊(duì)列
雙端隊(duì)列是一種允許我們同時(shí)從隊(duì)頭和隊(duì)尾進(jìn)行出隊(duì)和入隊(duì)操作的特殊隊(duì)列,它是隊(duì)列和棧的結(jié)合體。
使用數(shù)組實(shí)現(xiàn)雙端隊(duì)列源碼:
class Deque:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def addFront(self, item):
self.items.append(item)
def addRear(self, item):
self.items.insert(0, item)
def removeFront(self):
return self.items.pop()
def removeRear(self):
return self.items.pop(0)
def size(self):
return len(self.items)
4、使用雙端隊(duì)列解決回文問(wèn)題
回文是指從前往后讀和從后往前讀都一樣的字符串,例如radar、toot,以及madam。
需要構(gòu)建一個(gè)程序,它接受一個(gè)字符串并且檢測(cè)其是否為回文。
import my_deque
def palchecker(aString):
chardeque = my_deque.Deque()
for ch in aString:
chardeque.addRear(ch)
stillEqual = True
while chardeque.size() > 1 and stillEqual:
first = chardeque.removeFront()
last = chardeque.removeRear()
if first != last:
stillEqual = False
return stillEqual
print(palchecker('aaaabaaaa'))
print(palchecker('aaaabaaab'))
輸出結(jié)果為:
True
False
原文鏈接:https://juejin.cn/post/7195398266224115767#heading-1
相關(guān)推薦
- 2022-05-23 Android表格自定義控件使用詳解_Android
- 2022-07-30 find、filter、map的區(qū)別
- 2023-12-19 Mybatis使用注解實(shí)現(xiàn)復(fù)雜動(dòng)態(tài)SQL
- 2022-11-14 python流程控制語(yǔ)句
- 2022-06-04 Jenkins安裝的時(shí)區(qū)問(wèn)題分析解決_安裝教程
- 2022-06-21 C語(yǔ)言詳解無(wú)頭單向非循環(huán)鏈表各種操作方法_C 語(yǔ)言
- 2023-05-18 Go語(yǔ)言中map集合的具體使用_Golang
- 2022-06-28 C#中Lambda表達(dá)式的三種寫(xiě)法_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支