隊列是一種特殊的線性表,它只容許在表的前端(front)進行刪除(出隊)操做,而在表的後端(rear)進行插入(入隊)操做。html
棧又名堆棧,它和隊列同樣也是一種運算受限的線性表。限定僅在表尾進行插入和刪除操做的線性表。這一端被稱爲棧頂,相對地,把另外一端稱爲棧底。與先進先出隊列相比,棧的運做模式是後進先出。前端
棧和鏈表屬於線性表,意味着它能夠基於數組和鏈表來實現,它們和普通線性表相比只是在增長和刪除元素時只能在首尾操做,咱們只用提供push和pop接口,實現起來十分簡單。後端
在這裏咱們使用原生列表來實現,實際上使用咱們前面實現的動態數組和鏈表也是徹底沒有問題的。數據結構
Python:app
class Stack: def __init__(self,*args): self.data = [] def push(self,item): self.data.append(item) def pop(self): item = self.data.pop() return item class Queue: def __init__(self,*args): self.data = [] def push(self,item): self.data.append(item) def pop(self): item = self.data.pop(0) return item
C#:spa
class Queue<T> { private List<T> data; public Queue() { data = new List<T>(); } public void push(T item) { data.Add(item); } public T pop() { T res = data[0]; data.RemoveAt(0); return res; } } class Stack<T> { private List<T> data; public Stack() { data = new List<T>(); } public void push(T item) { data.Add(item); } public T pop() { T res = data[data.Count - 1]; data.RemoveAt(data.Count - 1); return res; } }
隊列除了先進先出外,也有循環隊列、後進先出隊列和優先隊列。code
循環隊列通常基於循環數組,它能夠節省增刪元素時沒必要要的空間和時間浪費。htm
後進先出隊列其實就和棧實現方式同樣,從這個角度來看棧無疑也是隊列的一種。blog
優先隊列則是實現了根據入隊時的權重,出隊永遠是隊列中權重最大的那個元素,優先隊列能夠基於最大堆來實現,在數據結構這系列博文的後續,我也會專門再寫一篇最大最小堆的博文。