You are on page 1of 50

Abstract Data Types

Cpt S 223. School of EECS, WSU

Purpose

Abstract Data Types (ADTs) Lists Stacks Queues

Cpt S 223. School of EECS, WSU

Primitive Data Type vs. Abstract Data Types


Primitive DT:
programmer

ADT:
progra ammer

Interface (API)

data

Implementation (methods) Data D t


Cpt S 223. School of EECS, WSU 3

Abstract Data Types (ADTs)

ADT is a set of objects together with a set of operations.

Abstract in that implementation of operations not specified Abstract in ADT definition E.g., List Insert, delete, search, sort

C++ class perfect for ADTs Can change ADT implementation details without breaking code using ADT

Cpt S 223. School of EECS, WSU

The List ADT


List of size N: A0, A1, , AN-1 Each element Ak has a unique position k in the list Elements can be arbitrarily complex Operations

insert(X,k), remove(k), find(X), findKth(k), printList()


Cpt S 223. School of EECS, WSU 5

Stack ADT

Stack is a list where insert and remove take place only at the top Operations

Push ( se ) e e e o top o us (insert) element on op of stack Pop (remove) element from top of stack p Top: return element at top of stack

LIFO (Last In First Out)


Cpt S 223. School of EECS, WSU 6

Queue ADT

Queue is a list where insert takes place at the back, but remove takes place at the front Operations

Enqueue (insert) element at the back of the queue Dequeue (remove and return) element from the front of the queue FIFO (First In First Out)
5 7 2 6 3 2 8 back
Cpt S 223. School of EECS, WSU 7

q Dequeue here front

Enque here

Lists Using Arrays


A0 A1 A2 A3

Operations

insert(X,k) O(N) remove(k) O(N) find(X) O(N) findKth(k) O(1) ( ) ( ) printList() O(N)

Read as order N. M Means runtime i ti is proportional to N

Read as order 1. Means runtime is constant (i.e., does not dependent on N)


8

Cpt S 223. School of EECS, WSU

Linked Lists

Elements not stored in contiguous memory Nodes in list consist of data element and next pointer
node

data

next

pointer
Cpt S 223. School of EECS, WSU

null
9

Linked Lists

Operations

Insert(X,A) Insert(X A) O(1)

Remove(A) O(1)
Cpt S 223. School of EECS, WSU 10

Linked Lists

Operations

find(X) O(N) findKth(k) O(N) printList() O(N)

Cpt S 223. School of EECS, WSU

11

Doubly-Linked List

Singly-linked list

insert(X,A) insert(X A) and remove(X) require pointer to node just before X Also keep pointer to previous node

Doubly linked Doubly-linked list

prev

next
12

Cpt S 223. School of EECS, WSU

Doubly-Linked List

Insert(X,A)

newA = new Node(A); newA->prev = X->prev; newA->next = X; X->prev->next = newA; X->prev = newA; X->prev->next = X->next; X->next->prev = X->prev;

Remove(X) ( )

Problems with operations at ends of list


Cpt S 223. School of EECS, WSU 13

Sentinel Nodes

Dummy head and tail nodes to avoid special cases at ends of list Doubly-linked Doubly linked list with sentinel nodes

Empty doubly-linked li t ith E t d bl li k d list with sentinel nodes ti l d

Cpt S 223. School of EECS, WSU

14

C++ Standard Template Library (STL)

Implementation of common data structures


List, stack, queue, Generally called containers www.sgi.com/tech/stl/ www sgi com/tech/stl/ www.cppreference.com/cppstl.html
Cpt S 223. School of EECS, WSU 15

WWW resources

Lists using STL

vector<Object>

Array-based implementation findKth fi dKth O(1) insert and remove O(N)

Unless change at end of vector

list<Object>

Doubly-linked list with sentinel nodes findKth O(N) insert and remove O(1)

If position of change is known

Both require O(N) for search h i O( ) f h


Cpt S 223. School of EECS, WSU 16

Container Methods

int size() const

Return number of elements in container Remove all elements from container Return true is container has no elements, otherwise returns false
Cpt S 223. School of EECS, WSU 17

void clear()

bool empty()

Vector and List Methods

void push_back (const Object & x)

Add x to end of list Remove object at end of list Return object at end of list Return object at front of list
Cpt S 223. School of EECS, WSU 18

void pop_back ()

const Object & back () const

const Object & front () const

List-only Methods

void push_front (const Object & x)

Add x to front of list Remove object at front of list

void pop_front ()

Cpt S 223. School of EECS, WSU

19

Vector-only Methods

Object & operator[] (int idx)

Return object at index idx in vector with no bounds-checking Return object at index idx in vector with boundschecking Return internal capacity of vector Set new capacity for vector (avoid expansion)
Cpt S 223. School of EECS, WSU

Object & at (int idx)

int capacity () const

void reserve (int newCapacity)

20

Iterators

Represents position in container Getting an iterator

iterator begin ()

Return appropriate iterator representing first item in container Return appropriate iterator representing end marker in container Position after last item in container
Cpt S 223. School of EECS, WSU 21

iterator end ()

Iterator Methods

itr++ and ++itr

Advance iterator itr to next location Return reference to object stored at iterator itrs location Return true if itr1 and itr2 refer to same location; otherwise return false Return true if itr1 and itr2 refer to different locations; otherwise return false
Cpt S 223. School of EECS, WSU 22

*itr

itr1 == itr2

itr1 != itr2 it 1 ! it 2

Example: printList
template <typename Container> void printList (const Container & lst) { for (typename Container::const_iterator itr = lst.begin(); itr != lst.end(); ++itr) { cout << *itr << endl; } }

Cpt S 223. School of EECS, WSU

23

Constant Iterators

iterator begin () const_iterator begin () const g iterator end () co st_ te ato end const iterator e d () co st const Appropriate version above returned based on whether container is const If const_iterator used, then *itr pp cannot appear on left-hand side of assignment (e.g., *itr=0 )
Cpt S 223. School of EECS, WSU 24

Better printList

Cpt S 223. School of EECS, WSU

25

Container Operations Requiring Iterators

iterator insert (iterator pos, const Object & x)


Add x into list, prior to position given by iterator pos Return iterator representing position of inserted item O(1) for lists, O(N) for vectors Remove object whose position is given by iterator pos Return iterator representing position of item f ll f following pos This operation invalidates pos O(1) for lists, O(N) for vectors Remove all items beginning at position start, up to, but not including end

iterator erase (iterator pos)


iterator erase (iterator start, iterator end) start

Cpt S 223. School of EECS, WSU

26

Implementation of Vector
constructor copy constructor destructor operator=

Cpt S 223. School of EECS, WSU

27

Implementation of Vector

Automatic resize

Cpt S 223. School of EECS, WSU

28

Implementation of Vector
Iterators (implemented using simple pointers)

Iterator methods

Cpt S 223. School of EECS, WSU

29

Implementation of List

Cpt S 223. School of EECS, WSU

Iterators implemented using nested class

30

Implementation of List

Cpt S 223. School of EECS, WSU

31

Implementation of List

Empty list

Cpt S 223. School of EECS, WSU

32

Implementation of List

Allows inheriting classes to access these.

Gives List class access to constructor.

Cpt S 223. School of EECS, WSU

33

Implementation of List

Allows inheriting classes to access these.

Note: there is no const here

Gives List class access to constructor.

Cpt S 223. School of EECS, WSU

34

Implementation of List

Cpt S 223. School of EECS, WSU

35

Implementation of List

Cpt S 223. School of EECS, WSU

36

Implementation of List

Cpt S 223. School of EECS, WSU

37

Stack ADT

Stack is a list where insert and remove take place only at the top Operations

Push ( se ) e e e o top o us (insert) element on op of stack Pop (remove) element from top of stack p Top: return element at top of stack

LIFO (Last In First Out)


Cpt S 223. School of EECS, WSU 38

Stack Implementation
Linked List template <typename Object> class stack { public: stack () {} void push (Object & x) { ? s.push_front (x); } void pop () { ? s.pop_front (); } Object & top () { ? s.front (); } private: list<Object> s; } Vector template <typename Object> class stack { public: stack () {} void push (Object & x) { s.push_back (x); } ? void pop () ? { s.pop_back (); } Object & top () ? { s.back (); } private: vector<Object> s; }
39

Cpt S 223. School of EECS, WSU

Stack Implementation
Linked List template <typename Object> class stack { public: stack () {} void push (Object & x) { ? s.push_front (x); } void pop () { ? s.pop_front (); } Object & top () { ? s.front (); } private: list<Object> s; } Vector template <typename Object> class stack { public: stack () {} void push (Object & x) { s.push_back (x); } void pop () { s.pop_back (); } Object & top () { s.back (); } private: vector<Object> s; }
40

Cpt S 223. School of EECS, WSU

Stack Implementation
Linked List template <typename Object> class stack { public: stack () {} void push (Object & x) { s.push_front (x); } void pop () { s.pop_front (); } Object & top () { s.front (); } private: list<Object> s; } Vector template <typename Object> class stack { public: stack () {} void push (Object & x) { s.push_back (x); } void pop () { s.pop_back (); } Object & top () { s.back (); } private: vector<Object> s; }
41

Cpt S 223. School ? Running Times of EECS, WSU

C++ STL Stack Class

Methods

#include <stack> stack<int> s; for (int i = 0; i < 5; i++ ) { s.push(i); } while (!s.empty()) { cout << s.top() << endl; s.pop(); }

Push, pop Push pop, top Empty, size

Cpt S 223. School of EECS, WSU

42

Stack Applications

Balancing symbols: ((()())(()))


stack<char> s; ; while not end of file { read character c if c = ( then s.push(c) if c = ) then if s.empty() then error else s.pop() } if (! s.empty()) s empty()) then error else okay

Cpt S 223. School of EECS, WSU

43

Stack Applications

Postfix expressions

Class PostFixCalculator { Means ((1 * 2) + 3) + (4 * 5) public: HP calculators ... void Multiply () Unambiguous (no need for { paranthesis) int i1 = s.top(); p() Infix needs paranthesis or s.pop(); else implicit precedence int i2 = s.top(); specification to avoid ambiguity s.pop(); s.push s push (i1 * i2); E g E.g., try a+(b*c) and (a+b)*c } private: stack<int> s; Postfix evaluation uses stack }

12*3+45*+

Cpt S 223. School of EECS, WSU

44

Stack Applications

Function calls Programming languages use stacks to keep g g g g p track of function calls When a function call occurs

Push CPU registers and program counter on to stack (activation record or stack frame) Upon return, restore registers and program d counter from top stack frame and pop

Cpt S 223. School of EECS, WSU

45

Queue ADT

Queue is a list where insert takes place at the back, but remove takes place at the front Operations

Enqueue (insert) element at the back of the queue Dequeue (remove and return) element from the front of the queue FIFO (First In First Out)
5 7 2 6 3 2 8 back
Cpt S 223. School of EECS, WSU 46

q Dequeue here front

Enque here

Queue Implementation
Linked List Li k d Li t template <typename Object> class queue { public: How would the runtime queue () {} change if vector is used void enqueue (Object & x) in implementation? { q.push_back (x); } Object & dequeue () { Object & x = q front (); q.front q.pop_front (); return x; } g Running time ? private: list<Object> q; } Cpt S 223. School of EECS, WSU 47

C++ STL Queue Class

Methods

#include <queue> queue<int> q; for (int i = 0; i < 5; i++ ) { q.push(i); } while (!q.empty()) { cout << q.front() << endl; q.pop(); }

Push (at back) Pop (from front) Back, Back front Empty, size

Cpt S 223. School of EECS, WSU

48

Queue Applications

Job scheduling Graph traversals Queuing theory

Cpt S 223. School of EECS, WSU

49

Summary

Abstract Data Types (ADTs)


Linked list Stack Queue

C++ Standard Template Library (STL) Numerous applications Building blocks for more complex data structures
Cpt S 223. School of EECS, WSU 50