Transcript Chapter 3

Chapter 3
The easy stuff
Lists
• If you only need to store a few things, the
simplest and easiest approach might be to
put them in a list
• Only if you need to search or some other
more intensive operation on the data
would a more complex structure be
needed
Lists
• A list is a finite, ordered sequence of data
items know as elements
• Each element has a position
• It’s empty when it contains no elements
• The number of current elements is its
length
• The first element is the head
• The last element is the tail
Basic Operations
• Must be able to insert and delete
anywhere along the list
• Should be able to gain access to an
elements value
• Must be able to create and clear the list
• Convenient to gain access to the next
element from the current one
List ADT
• In C++ we will use the notion of an
abstract class for the List
• We will increase the flexibility by making it
a template
• The abstract class does not specify how
the operations are implemented
• Given that we want to support the concept
of a sequence, the key decision embodied
in the ADT is the notion of position
Details
• Assuming that we all have implemented a
linked list
• There are 4 steps for insertion
– Create an empty node
– Initialize the data member to the value to be
stored
– Fix the pointers for next and prev
– Make sure any head and tail pointers are still
valide
Deletion
•
•
•
•
The node to be deleted is targeted
A temporary pointer to that node is created
The node is redirected around
The temporary pointer is used to delete
the node
Circular Lists
• Normally not a good idea
• But there are times when one might be useful
– When you have multiple processes using a resource
• The end of the list simply points back to the
head
• There is a tail pointer and that’s it.
• Data can be inserted either at the front or at the
end
Skip Lists
• Linked lists have the drawback that each
node must be searched when looking for
data
• Ordering the data can solve this to some
degree, but you still must sequentially
scan the list
• Skip lists solve this problem of sequential
search.
Self Organizing Lists
• List are not good at searching
• In order to speed up that process, you can
use organizing strategies that can help
• Here are four methods
– Move-to-front
– Transpose
– Count
– Ordering
Other Thoughts
• Sometimes it is helpful to have sentinel
nodes
• A sentinel node is a node type that
contains no data
• It is used to simplify some operations
• It can also make others more complicates
• In this case, an empty list contains two
sentinels and nothing else
Other Linear
Structures
Stacks, Queues and Deques
Stacks
 The stack is a list-like structure in which
elements may be inserted or removed
from only one end.
 A stack follows a LIFO access pattern
 Elements are stored and removed in
reverse order of their arrival
 Elements are pushed on the stack
 Elements are popped off the stack
Useful Operations
 Clear
 isEmpty
 Push
 Pop
 TopEl

Returns the topmost element without
removing it from the stack
What are stacks good for?
 Stacks can be used for a lot of activities



Compilers will use them to check for
balanced brackets, parenthesis, comment,
etc.
You can use them to implement an infinite
precision calculator
And of course, the run-time stack
Queues
 The queue is a list-like structure that
provides restricted access to its
elements
 Elements are enqueued at the back
 Elements are dequed from the front
 Queues follow a FIFO access pattern
Useful Operations
 Clear
 isEmpty
 Enqueue
 Dequeue
 firstEl

Returns the first element without removing
it from the queue
What are queues good for?
 Queues can be used in many situations

You can use them to determine if a poem
is an acrostic
 Queuing theory from mathematics
obviously will use queues

A bank wants to determine the number of
tellers required to keep customer wait to a
minimum
Queue Implementation
 What are some obvious ways to
implement a queue?


Linked
Array based
 What is the problem with an array based
implementation?

The head and the tail will creep.
 What is the solution?
 Make the queue circular
Deque
 A double ended queue.
 You have direct access to both ends of
the list.
 The STL has an interesting
implementation of a deque
Iterators
A pure abstraction
Introduction

“Iterators are the glue that holds
containers and algorithms togther”.

P 549 The C++ Programming Language,
Bjarne Stroustrup
They provide an abstract view of data
 Iterators support an abstract model of
data as sequences.

Iterators and Sequences
An iterator is pure abstraction
 Anything that behaves like an iterator is
an iterator
 An iterator is an abstraction of a pointer
to an element of a sequence
 For example, an int* is an interator to
int[]

More Iterator Issues
There is no concept of a “null iterator”
 An iterator that points to nothing typically
points to the same value as “one past
the end” and should be compared to that
same value
 If an iterator points to an element, it is
said to be valid.

Const Iterators

Const iterators support the same
behavior as non-const interators with the
major exception that const iterators are
not allow to modify the container to
which they point.