寫在前面:棧是先入后出,與之相反的是隊列,隊列是先進先出的線性結構。隊列是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭。
隊列的存儲結構中使用的最多的是循環隊列。循環隊列的一個好處是:可以利用這個隊列之前用過的空間。
在一個普通隊列里,一旦一個隊列滿了,我們就不能插入下一個元素,即使在隊列前面仍有空間。但是使用循環隊列,我們能使用這些空間去存儲新的值。我們要做的就是利用循環來解決空間浪費的問題!
1.循環隊列包括兩個指針(其實就是兩個整數型變量,因為在這里有指示作用,所以這里理解為指針), front 指針指向隊頭元素, rear 指針指向隊尾元素的下一個位置。
2.rear和front互相追趕着,這個追趕過程就是隊列添加和刪除的過程,如果rear追到head說明隊列滿了,如果front追到rear說明隊列為空。
2.令隊列空間中的一個單元閑置,使得隊列非空時,Q.rear與Q.front之間至少間隔一個空閑單元。
隊列為空的判斷條件是:front == rear
隊列滿的判斷條件是:(rear+1)%maxsize == front
隊列長度的計算公式:(rear-front+maxsize)%maxsize
python實現代碼如下:
class SqQueue(object): def __init__(self, maxsize): self.queue = [None] * maxsize self.maxsize = maxsize self.front = 0 self.rear = 0 # 返回當前隊列的長度
def QueueLength(self): return (self.rear - self.front + self.maxsize) % self.maxsize # 如果隊列未滿,則在隊尾插入元素,時間復雜度O(1)
def EnQueue(self, data): if (self.rear + 1) % self.maxsize == self.front: print("The queue is full!") else: self.queue[self.rear] = data # self.queue.insert(self.rear,data)
self.rear = (self.rear + 1) % self.maxsize # 如果隊列不為空,則刪除隊頭的元素,時間復雜度O(1)
def DeQueue(self): if self.rear == self.front: print("The queue is empty!") else: data = self.queue[self.front] self.queue[self.front] = None self.front = (self.front + 1) % self.maxsize return data # 輸出隊列中的元素
def ShowQueue(self): for i in range(self.maxsize): print(self.queue[i],end=',') print(' ')
參考:https://blog.csdn.net/u012626619/article/details/80658397