演算法導論程式20 棧和佇列(Python)

2021-08-01 14:51:23 字數 2260 閱讀 8012

棧(stack):後進先出(last-in,first-out,lifo)被刪除的是最近插入的元素。

佇列(queue):先進先出(first-in,first-out,fifo)被刪除的總是在集合中存在時間最長的那個元素。

棧:insert(push):壓入

delete(pop):彈出

s[0...n-1]來實現乙個最多可容納n個元素的棧。該陣列有乙個屬性s.top,指向最新插入的元素。棧中包含的元素為s[0....top],其中,s[0]是棧底元素,而s[top]是棧頂元素。

當s.top=-1時,棧中不包含任何元素,即棧是空的。要測試乙個棧是否為空可以用查詢操作stack-empty。如果試圖對乙個空棧執行彈出操作,則稱棧下溢(underflow),這通常是乙個錯誤。如果s.top超過了n-1,則稱棧上溢(overflow)。

class stack:

def __init__(self,s=,top=-1):

self.top=top

self.s=s

def stack_empty(self):

if self.top==-1:

return true

else:

return false

def push(self,x):

self.top+=1

def pop(self):

if self.stack_empty():

print("underflow")

else:

self.top-=1

return s.pop()

執行:

>>> s=[13,4,5,6,5,6]

>>> top=5

>>> ss=stack(s,top)

>>> ss.pop()

6>>> ss.pop()

5>>> ss.s

[13, 4, 5, 6]

>>> ss.top

3

佇列:入隊(enqueue):insert操作

出隊(dequeue):delete操作

用陣列q[0...n-1]表示乙個最多容納n-1個元素的佇列的一種方式。

q.head指向表頭

q.tail指向下乙個新元素將要插入的位置

初始時,q.head=q.tail=0。如果想要從中刪除元素,則發生佇列下溢。

當q.head=q.tail,隊列為空。

當q.head=q.tail+1時,佇列滿。

此時,若試圖插入元素,則佇列發生上溢。

class queue:

def __init__(self,q,head,tail,n):

self.q=q

self.head=head

self.tail=tail

self.n=n

def enqueue(self,x):

if self.head==self.tail+1 or (self.head==0 and self.tail == n-1):

return "overflow"

q[self.tail]=x

if self.tail == len(q)-1:

self.tail=0

else:

self.tail+=1

def dequeue(self):

if self.head==self.tail:

return "underflow"

x=q[self.head]

q[self.head]=0

if self.head==len(q)-1:

self.head=0

else:

self.head+=1

return x

執行:

>>> q=[15,7,8,9,10]

>>> head=0

>>> tail=4

>>> n=5

>>> q=queue(q,head,tail,n)

>>> q.enqueue(11)

'overflow'

>>> q.dequeue()

15>>> q.q

[0, 7, 8, 9, 10]

>>> q.head

1>>> q.tail

4>>> q.dequeue()

7

佇列最多存放n-1個佇列元素。

演算法導論 棧與佇列

用兩個棧來實現乙個佇列。不包括棧與佇列的具體實現,包括10 1課後練習。呼叫stl。棧的特點是後進先出,佇列的特點是先進先出。所以用兩個棧實現佇列只需要把在出佇列時把第乙個棧的元素全部壓到第二個棧 第二個棧為空 這個時候第二個棧的順序就是佇列順序也就是先進先出。以下是實現 include inclu...

棧和佇列演算法

1 實現乙個棧,要求實現push 出棧 pop 入棧 min 返回最小值 的時間 複雜度為o 1 方法1 使用乙個棧實現,交叉棧 pragma once include define max value 100 typedef struct minstackminstack 實現乙個棧,要求實現pu...

演算法 佇列和棧

雙端佇列的首部和尾部都可以亞壓入元素 public class statck stacktest array public static void stacktest int array else else data.push array i system.out.println 每一步棧的最小值 ...