Dynamic Data Structures: Lists, Stacks, Queues, and Trees