数据结构——队列和栈
1. 简介
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除(出队)操作,而在表的后端(rear)进行插入(入队)操作。
栈又名堆栈,它和队列一样也是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。与先进先出队列相比,栈的运作模式是后进先出。
2.具体实现
栈和链表属于线性表,意味着它可以基于数组和链表来实现,它们和普通线性表相比只是在增加和删除元素时只能在首尾操作,我们只用提供push和pop接口,实现起来十分简单。
在这里我们使用原生列表来实现,实际上使用我们前面实现的动态数组和链表也是完全没有问题的。
Python:
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#:
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; } }
3. 队列和栈的更多形式
队列除了先进先出外,也有循环队列、后进先出队列和优先队列。
循环队列一般基于循环数组,它可以节省增删元素时不必要的空间和时间浪费。
后进先出队列其实就和栈实现方式一样,从这个角度来看栈无疑也是队列的一种。
优先队列则是实现了根据入队时的权重,出队永远是队列中权重最大的那个元素,优先队列可以基于最大堆来实现,在数据结构这系列博文的后续,我也会专门再写一篇最大最小堆的博文。