字符画之画线性容器

  1. Vector(向量)
  2. List(链表)
  3. Stack(栈)
  4. Queue(队列)
  5. 附:代码实现

用字符“画”线性容器,包括Vector, List, Stack, Queue。

Vector(向量)

Vector是可以动态修必储空间的数组,在程序上,是维护存储容量、元素数量、数组数据的过程。

template <typename T>
class Vector
{
    int     m_cap;      /** 存储容量 */
    int     m_size;     /** 元素数量 */
    T*      m_array;    /** 存放数据的数组 */
};

如下图,Vector的容量是5,已经存了3个元素,数据分别是abc。

内存:[a][b][c][ ][ ]
下标: 0  1  2  3  4

对于Vector:

  • 元素可以通过下标访问,速度快,时间复杂度为O(1);
  • 元素的删除和插入,需要移动数据,速度慢,时间复杂度为O(n);
  • 尾部删除和插入例外,时间复杂度为O(1)。

List(链表)

List的数据由一个个通过指针连接的节点构成,节点连接示意图如下。List需要维护各节点之间的连接关系,可以看到

  • 节点的遍历需要从head或者tail开始,时间复杂度为O(n);
  • 节点的插入和删除,只是节点连接关系的修改,速度快,时间复杂度为O(1)。
      head                tail
节点:[a] -> [b]-> ... -> [c]
          <-    <- ... <-

节点的连接通过指针实现,代码如下:

template <typename T>
struct ListNode
{
    T   data;
    ListNode<T>*   prev;
    ListNode<T>*   next;
};

Stack(栈)

Stack是一种先进后出(FILO)的数据结构,可以通过Vector或List实现,Stack任何时候都只能访问和操作顶部top的数据,如下图所示。

       [ ]
top -> [a]
       [b]
       [c]

Queue(队列)

Queue是一种先进先出(FIFO)的数据结构,可以通过Vector或List实现,Queue任何时候只能只访问和操作头尾head和尾部tail的数据,数据一般从tail进,从head出,如下图所示。

 tail            head
  [a][b][c]...[e][f]

下一个入队的数据:放在a的左边
下一个出队的数据:f

附:代码实现


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 [ yehuohan@gmail.com ]

文章标题:字符画之画线性容器

本文作者:Y

发布时间:2019-03-26, 20:10:17

最后更新:2019-05-21, 20:44:44

原始链接:http://yehuohan.github.io/2019/03/26/%E7%AC%94%E8%AE%B0/DSA/%E5%AD%97%E7%AC%A6%E7%94%BB%E4%B9%8B%E7%94%BB%E7%BA%BF%E6%80%A7%E5%AE%B9%E5%99%A8/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。