Source: http://www.comp.nus.edu.sg/~cs1020/lect/15s2/Lect9-ADT.pdf