Linear ADTs

Linear ADTs model an ordered (not sorted) homogenous list of data. There are several common types of linear ADTs that differ in Behaviors.

Common Linear ADTs

List

  • Characteristics

    • Sequential - the elements are ordered in a sequence

    • Finite - known number of elements

    • Indexable - each element has a unique positional index to allow random access

    • Dynamic - the size of the list can change

  • Behaviors

    • add/remove/access by index

    • search (find index or pointer by value)

    • find size

    • check empty

  • Implementation

    • C array (fast access/read by index)

    • linked-list (fast add/remove in the middle)

Stack

  • Characteristics

    • Finite

    • Last-in-first-out (LIFO)

    • Dynamic

  • Behaviors

    • push

    • pop

    • peek/top

    • check empty

  • Implementation

    • C array (add/remove at the tail, limited max length)

    • linked-list (add/remove at either end, unlimited max length)

  • Application

    • Backtracking algorithm

    • Depth-first traversal

Queue

  • Characteristics

    • Finite

    • First-in-first-out (FIFO)

    • Dynamic

  • Behaviors

    • enqueue

    • dequeue

    • check empty

  • Implementation

    • circular C array (limited max length)

    • linked-list (unlimited max length)

  • Application

    • Breadth-first traversal

Deque

  • Characteristics

    • Finite

    • First-in-first-out (FIFO) and Last-in-first-out (LIFO)

    • Dynamic

  • Behaviors

    • enqueue_front, enqueue_back

    • dequeue_front, dequeue_back

    • check empty

  • Implementation

    • circular C array (limited max length)

    • linked-list (unlimited max length)

    • vector of vectors (std::deque in C++ STL)

Data Structures to Implement Linear ADTs

There are many data structures suitable in the implementation of the above ADTs. They should be selected according to the requirements.

  • C style Array

    • Fast indexing

    • Slow insertion, or pre-pending

    • Fast appending

    • Slow to change capacity (with re-allocation and data movement)

    • Circular variation (suitable for queue and deque)

  • Linked-list

    • Fast insertion, appending, pre-pending

    • Slow indexing

    • Complex logics

    • More space overhead

  • Related STL containers and their implementations

    • std::array

      • fixed size

      • static C array

    • std::vector

      • resizable (slow)

      • dynamic C array

    • std::list

      • doubly-linked-list

    • std::forward_list

      • singly-linked-list

    • std::deque

      • vector of vectors

    • std::stack

      • wrapper of other STL containers

    • std::queue

      • wrapper of other STL containers