栈有两个基本的操作,push和pop。
元素以后进者先出的顺序被加入(pushed)和被移除(popped)。如果栈是空的,pop操作通常会返回null或者抛出异常。
当栈使用链表实现的,这些操作时间复杂度都是O(1)。如果使用数组实现的,元素的数量会有一个最大值,push和pop的时间复杂度还是O(1)。如果数组size是动态的,push和pop平摊开的时间复杂度还是O(1)。栈还有其他的操作比如peek,可以返回栈顶元素,并且不会pop它。
学习辨别什么时候栈的LIFO特性是可应用的,例如从一个栈中解析特定的益处。
考虑扩展基本的栈与队列的数据结构去支持额外的操作,例如找到最大值的元素。
当操作C++的栈时,我们需要非常了解stack这个类。stack类关键的方法包括top(), push(42)(或者emplace(42)), 和pop()。当一个空的栈调用top()和pop()时会抛出异常。
push(e)会把一个元素push到栈上面。一般不会出错。
top()会获取但是不会移除栈顶元素。
pop()会移除栈顶元素但是不会返回。为了避免异常,需要首先检测empty()。
empty()会检测栈是否为空。
队列包括两种基本操作,enqueue和dequeue。如果队列是空的,dequeue操作通常会返回null或者抛出异常。元素以先进者先出的顺序被加入(enqueued)和被移除(dequeued)。最近被插入的元素被称为tail或者back元素,最早被插入的被称为head或者front元素。
队列可以使用链表实现的,此时这些操作时间复杂度都是O(1)。队列的API经常包括一些其它的操作,例如返回队列head的元素并且不移除它,返回队列tail的元素并且不移除它。队列也可以用数组来实现。
deque,有时也被称作双端队列,是一个双向链表,所有的插入和删除操作都在链表两端中的某一端,比如在head或者tail。front的插入通常叫做push,back的插入通常叫做inject。front的删除通常叫做pop,back的删除通常叫做eject(不同的语言会有不同的命名法)。
学习辨别什么时候队列的FIFO特性是可应用的,例如当需要维持顺序是,队列是非常理想的。