Professional Documents
Culture Documents
Abstract Data Types Abstract Data Types: 1111 CPT S 223. School of EECS, WSU
Abstract Data Types Abstract Data Types: 1111 CPT S 223. School of EECS, WSU
Topics
ADT:
progra ammer
Interface (API)
Abstract Abstract in that implementation of operations not specified in ADT definition E.g., List Insert, delete, search, sort
C++ classes are perfect for ADTs Can change ADT implementation details without breaking code using 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
Stack ADT
Stack = a list where insert and remove take place only at the top Operations
Push us ( (insert) se ) e element e e o on top op o of stack Pop (remove) element from top p of stack Top: return element at top of stack
Queue ADT
Queue = 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 8
Enque here
Operations
insert(X,k) : O(N) remove(k) : O(N) find(X) : O(N) findKth(k) ( ) : O(1) ( ) printList() : O(N)
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
11
Linked Lists
Operations
Remove(A) O(1)
Cpt S 223. School of EECS, WSU 12
Linked Lists
Operations
13
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
prev
next
14
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) ( )
Sentinel Nodes
Dummy head and tail nodes to avoid special cases at ends of list Doubly linked list with sentinel nodes Doubly-linked
16
List, stack, queue, Generally called containers www.sgi.com/tech/stl/ www sgi com/tech/stl/ http://www.cplusplus.com/reference/stl/ www.cppreference.com/cppstl.html f / tl ht l
Cpt S 223. School of EECS, WSU 17
vector<Object>
list<Object>
Doubly-linked list with sentinel nodes findKth O(N) insert and remove O(1)
Container Methods
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 19
void clear()
bool empty()
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 20
void pop_back ()
List-only Methods
void pop_front ()
21
Vector-only Methods
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
22
Iterators
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 23
iterator end ()
Iterator Methods
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 24
*itr
itr1 == itr2
it 1 ! itr1 != it itr2 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; } }
25
Constant Iterators
iterator begin () const_iterator begin g () const iterator end () const co st_iterator te ato e end d () co const st Appropriate version above returned based on whether container is const If const_iterator used, then *itr pp on left-hand side of cannot appear assignment (e.g., *itr=0 )
Cpt S 223. School of EECS, WSU 26
Better printList
27
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 f item f following ll 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
28
Implementation of Vector
constructor copy constructor destructor operator=
29
Implementation of Vector
Automatic resize
30
Implementation of Vector
Iterators (implemented using simple pointers)
Iterator methods
31
Implementation of List
32
Implementation of List
33
Implementation of List
Empty list
34
Implementation of List
35
Implementation of List
36
Implementation of List
37
Implementation of List
38
Implementation of List
39
Stack ADT
Stack is a list where insert and remove take place only at the top Operations
Push us ( (insert) se ) e element e e o on top op o of stack Pop (remove) element from top p of stack Top: return element at top of stack
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
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; }
42
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; }
Running g Times ?
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; }
43
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(); }
44
Stack Applications
45
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 (i1 * i2); s.push E.g., E g try a+(b*c) and (a+b)*c } private: stack<int> s; Postfix evaluation uses stack }
12*3+45*+
46
Stack Applications
Function calls Programming g g languages g g use stacks to keep 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 d program counter from top stack frame and pop
47
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 48
Enque here
Queue Implementation
Li k d Li Linked List 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 time ? Running private: list<Object> q; } Cpt S 223. School of EECS, WSU 49
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 front Back, Empty, size
50
Queue Applications
51
Summary
C++ Standard Template Library (STL) Numerous applications Building blocks for more complex data structures
Cpt S 223. School of EECS, WSU 52