棧和隊(duì)列數(shù)據(jù)結(jié)構(gòu)的基本概念及其相關(guān)的Python實(shí)現(xiàn)
先來(lái)回顧一下棧和隊(duì)列的基本概念:
相同點(diǎn):從"數(shù)據(jù)結(jié)構(gòu)"的角度看,它們都是線性結(jié)構(gòu),即數(shù)據(jù)元素之間的關(guān)系相同。
不同點(diǎn):棧(Stack)是限定只能在表的一端進(jìn)行插入和刪除操作的線性表。 隊(duì)列(Queue)是限定只能在表的一端進(jìn)行插入和在另一端進(jìn)行刪除操作的線性表。它們是完全不同的數(shù)據(jù)類型。除了它們各自的基本操作集不同外,主要區(qū)別是對(duì)插入和刪除操作的"限定"。
棧必須按"后進(jìn)先出"的規(guī)則進(jìn)行操作:比如說(shuō),小學(xué)老師批改學(xué)生的作業(yè),如果不打亂作業(yè)本的順序的話,那么老師批改的第一份作業(yè)一定是最后那名同學(xué)交的那份作業(yè),如果把所有作業(yè)本看作是一個(gè)棧中的元素,那么最后一個(gè)同學(xué)交的作業(yè)本就是棧頂元素,而第一個(gè)同學(xué)交的,也就是最低端的作業(yè)本,就是棧底元素,這就是對(duì)棧的讀取規(guī)則。
而隊(duì)列必須按"先進(jìn)先出"的規(guī)則進(jìn)行操作:打個(gè)比方,一些人去銀行辦理業(yè)務(wù),一定是先去排隊(duì)的最先得到服務(wù),當(dāng)然他也是第一個(gè)走出銀行的(假設(shè)這些人都在一個(gè)窗口排隊(duì))。如果把所有這些等候服務(wù)的人看作是隊(duì)的元素,第一個(gè)人就是對(duì)頭元素,相應(yīng)的,最后一個(gè)人就是隊(duì)尾元素。這是隊(duì)的讀取規(guī)則。
用Python實(shí)現(xiàn)棧,這是Python核心編程里的一個(gè)例子:
#!/usr/bin/env python
#定義一個(gè)列表來(lái)模擬棧
stack = []
#進(jìn)棧,調(diào)用列表的append()函數(shù)加到列表的末尾,strip()沒(méi)有參數(shù)是去掉首尾的空格
def pushit():
stack.append(raw_input('Enter new string: ').strip())
#出棧,用到了pop()函數(shù)
def popit():
if len(stack) == 0:
print 'Cannot pop from an empty stack!'
else:
print 'Removed [', stack.pop(), ']'
#編歷棧
def viewstack():
print stack
#CMDs是字典的使用
CMDs = {'u': pushit, 'o': popit, 'v': viewstack}
#pr為提示字符
def showmenu():
pr = """
p(U)sh
p(O)p
(V)iew
(Q)uit
Enter choice: """
while True:
while True:
try:
#先用strip()去掉空格,再把第一個(gè)字符轉(zhuǎn)換成小寫(xiě)的
choice = raw_input(pr).strip()[0].lower()
except (EOFError, KeyboardInterrupt, IndexError):
choice = 'q'
print '\nYou picked: [%s]' % choice
if choice not in 'uovq':
print 'Invalid option, try again'
else:
break
#CMDs[]根據(jù)輸入的choice從字典中對(duì)應(yīng)相應(yīng)的value,比如說(shuō)輸入u,從字典中得到value為pushit,執(zhí)行pushit()進(jìn)棧操作
if choice == 'q':
break
CMDs[choice]()
#判斷是否是從本文件進(jìn)入,而不是被調(diào)用
if __name__ == '__main__':
showmenu()
用Python實(shí)現(xiàn)隊(duì)列:
#!/usr/bin/env python
queue = []
def enQ():
queue.append(raw_input('Enter new string: ').strip())
#調(diào)用list的列表的pop()函數(shù).pop(0)為列表的第一個(gè)元素
def deQ():
if len(queue) == 0:
print 'Cannot pop from an empty queue!'
else:
print 'Removed [', queue.pop(0) ,']'
def viewQ():
print queue
CMDs = {'e': enQ, 'd': deQ, 'v': viewQ}
def showmenu():
pr = """
(E)nqueue
(D)equeue
(V)iew
(Q)uit
Enter choice: """
while True:
while True:
try:
choice = raw_input(pr).strip()[0].lower()
except (EOFError, KeyboardInterrupt, IndexError):
choice = 'q'
print '\nYou picked: [%s]' % choice
if choice not in 'devq':
print 'Invalid option, try again'
else:
break
if choice == 'q':
break
CMDs[choice]()
if __name__ == '__main__':
showmenu()
- 使用python實(shí)現(xiàn)數(shù)組、鏈表、隊(duì)列、棧的方法
- Python棧的實(shí)現(xiàn)方法示例【列表、單鏈表】
- python棧的基本定義與使用方法示例【初始化、賦值、入棧、出棧等】
- Python算法之棧(stack)的實(shí)現(xiàn)
- python實(shí)現(xiàn)堆棧與隊(duì)列的方法
- Python基于list的append和pop方法實(shí)現(xiàn)堆棧與隊(duì)列功能示例
- Python雙鏈表原理與實(shí)現(xiàn)方法詳解
- Python單鏈表原理與實(shí)現(xiàn)方法詳解
- python雙向鏈表實(shí)現(xiàn)實(shí)例代碼
- python數(shù)據(jù)結(jié)構(gòu)鏈表之單向鏈表(實(shí)例講解)
- Python實(shí)現(xiàn)棧的方法詳解【基于數(shù)組和單鏈表兩種方法】
相關(guān)文章
Python調(diào)用騰訊API進(jìn)行人像動(dòng)漫化效果實(shí)例
最近上網(wǎng)的時(shí)候看到了一個(gè)有趣的東西,叫做人物動(dòng)漫化,嘗試著用python實(shí)現(xiàn)了,所以下面這篇文章主要給大家介紹了關(guān)于Python調(diào)用騰訊API進(jìn)行人像動(dòng)漫化效果的相關(guān)資料,需要的朋友可以參考下2023-06-06
Python代碼太長(zhǎng)換行的實(shí)現(xiàn)
這篇文章主要介紹了Python代碼太長(zhǎng)換行的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Pandas數(shù)據(jù)操作及數(shù)據(jù)分析常用技術(shù)介紹
Pandas是Python中用于數(shù)據(jù)處理和數(shù)據(jù)分析的庫(kù),具有強(qiáng)大的數(shù)據(jù)操作和分析功能,包括數(shù)據(jù)清洗、轉(zhuǎn)換、篩選、聚合等。常用技術(shù)有數(shù)據(jù)讀取與寫(xiě)入、數(shù)據(jù)索引、數(shù)據(jù)切片、數(shù)據(jù)合并、數(shù)據(jù)透視表、數(shù)據(jù)可視化等,適用于各種數(shù)據(jù)分析和機(jī)器學(xué)習(xí)任務(wù)2023-04-04
Python中實(shí)現(xiàn)字符串類型與字典類型相互轉(zhuǎn)換的方法
這篇文章主要介紹了Python中實(shí)現(xiàn)字符串類型與字典類型相互轉(zhuǎn)換的方法,非常實(shí)用,需要的朋友可以參考下2014-08-08
Python 中最長(zhǎng)公共子序列的長(zhǎng)度
子序列是在不改變剩余字符的順序的情況下,在刪除一些字符或不刪除任何字符后從給定序列獲得的序列,這篇文章主要介紹了Python 中的最長(zhǎng)公共子序列,需要的朋友可以參考下2023-06-06
matplotlib如何設(shè)置坐標(biāo)軸刻度的個(gè)數(shù)及標(biāo)簽的方法總結(jié)
這里介紹兩種設(shè)置坐標(biāo)軸刻度的方法,一種是利用pyplot提交的api去進(jìn)行設(shè)置,另一種是通過(guò)調(diào)用面向?qū)ο蟮腶pi, 即通過(guò)matplotlib.axes.Axes去設(shè)置,需要的朋友可以參考下2021-06-06
python中isoweekday和weekday的區(qū)別及說(shuō)明
這篇文章主要介紹了python中isoweekday和weekday的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07

