CS201: Data Structures and Discrete Mathematics I

Slides:



Advertisements
Similar presentations
Data Structures Through C
Advertisements

Stacks, Queues, and Linked Lists
CS201: Data Structures and Discrete Mathematics I Linked Lists, Stacks and Queues.
Stack & Queues COP 3502.
COSC 1P03 Data Structures and Abstraction 9.1 The Queue Whenever you are asked if you can do a job, tell 'em, "Certainly, I can!" Then get busy and find.
COMPSCI 105 S Principles of Computer Science 13 Stacks.
Stacks, Queues, and Deques. 2 A stack is a last in, first out (LIFO) data structure Items are removed from a stack in the reverse order from the way they.
Queues CS-212 Dick Steflik. Queues First In, First Out operation – FIFO As items are added they are chronologically ordered, items are removed in their.
Queues 4/14/2017 5:24 PM 5.2 Queues Queues Dr Zeinab Eid.
Elementary Data Structures CS 110: Data Structures and Algorithms First Semester,
1 Queues (5.2) CSE 2011 Winter May Announcements York Programming Contest Link also available from.
E.G.M. Petrakisstacks, queues1 Stacks  Stack: restricted variant of list  elements may by inserted or deleted from only one end : LIFO lists  top: the.
Stacks, Queues & Deques CSC212.
1 Lecture 24 Abstract Data Types (ADT) –I Overview  What is an Abstract Data type?  What is Stack ADT?  Stack ADT Specifications  Array Implementation.
Stack: Linked List Implementation Push and pop at the head of the list New nodes should be inserted at the front of the list, so that they become the top.
Implementing and Using Stacks
1 Stack Data : a collection of homogeneous elements arranged in a sequence. Only the first element may be accessed Main Operations: Push : insert an element.
Stacks, Queues, and Deques
1 Stacks – Chapter 3 A stack is a data structure in which all insertions and deletions of entries are made at one end, called the top of the stack. Alternatively,
CHAPTER 05 Compiled by: Dr. Mohammad Omar Alhawarat Stacks & Queues.
DATA STRUCTURES AND ALGORITHMS Lecture Notes 4 Prepared by İnanç TAHRALI.
Data Structures (part 2). Stacks An Everyday Example Your boss keeps bringing you important items to deal with and keeps saying: “Put that last ‘rush’
30 May Stacks (5.1) CSE 2011 Winter Stacks2 Abstract Data Types (ADTs) An abstract data type (ADT) is an abstraction of a data structure An.
Intro. to Data Structures Chapter 3: Lists, Stacks, Queues 1 Chapter 3 Lists, Stacks, and Queues Abstract Data Types (ADTs) Lists Stacks Queues.
IKI 10100: Data Structures & Algorithms Ruli Manurung (acknowledgments to Denny & Ade Azurat) 1 Fasilkom UI Ruli Manurung (Fasilkom UI)IKI10100: Lecture6.
1 Linked-list, stack and queue. 2 Outline Abstract Data Type (ADT)‏ Linked list Stack Queue.
1 Stacks & Queues CSC Stacks & Queues Stack: Last In First Out (LIFO). –Used in procedure calls, to compute arithmetic expressions etc. Queue: First.
Stacks & Queues. Introduction to Stacks and Queues Widely used data structures Ordered List of element Easy to implement Easy to use.
Stacks & Queues CSC 172 SPRING 2002 LECTURE 4 Agenda  Stack  Definition  Implementation  Analysis  Queue  Definition  Implementation  Analysis.
Click to edit Master text styles Stacks Data Structure.
Chapter 3 Lists, Stacks, Queues. Abstract Data Types A set of items – Just items, not data types, nothing related to programming code A set of operations.
Stacks and Queues. 2 Abstract Data Types (ADTs) abstract data type (ADT): A specification of a collection of data and the operations that can be performed.
Linked Data Structures
CSE 1342 Programming Concepts
Stacks (and Queues).
Elementary Data Structures
Review Array Array Elements Accessing array elements
Queues 5/11/2018 Presentation for use with the textbook Data Structures and Algorithms in Java, 6th edition, by M. T. Goodrich, R. Tamassia, and M. H.
Data Structure By Amee Trivedi.
G64ADS Advanced Data Structures
COSC160: Data Structures: Lists and Queues
Stacks.
Stacks and Queues.
Queues Queues Queues.
CMSC 341 Lecture 5 Stacks, Queues
Stacks.
Stacks, Queues, and Deques
Queues.
Stacks and Queues.
Queues 11/22/2018 6:47 AM 5.2 Queues Queues Dr Zeinab Eid.
Queues 3/9/15 Presentation for use with the textbook Data Structures and Algorithms in Java, 6th edition, by M. T. Goodrich, R. Tamassia, and M. H. Goldwasser,
Stacks and Queues CLRS, Section 10.1.
Recall What is a Data Structure Very Fundamental Data Structures
Stacks and Queues 1.
Stacks Abstract Data Types (ADTs) Stacks
Cs212: Data Structures Computer Science Department Lecture 6: Stacks.
CS210- Lecture 5 Jun 9, 2005 Agenda Queues
Queues Jyh-Shing Roger Jang (張智星)
Stacks.
Copyright © Aiman Hanna All rights reserved
CE 221 Data Structures and Algorithms
More Data Structures (Part 1)
Stacks CS-240 Dick Steflik.
Stacks and Queues CSE 373 Data Structures.
Stacks, Queues, and Deques
Data Structures and Algorithms 2/2561
Data Structures and Algorithms 2/2561
Stacks and Queues.
LINEAR DATA STRUCTURES
Lecture 9: Stack and Queue
Presentation transcript:

CS201: Data Structures and Discrete Mathematics I Linked List, Stacks and Queues

Data Structure A construct that can be defined within a programming language to store a collection of data one may store some data in an array of integers, an array of objects, or an array of arrays 9/19/2018 CS 201

Abstract Data Type (ADT) Definition: a collection of data together with a set of operations on that data specifications indicate what ADT operations do, but not how to implement them data structures are part of an ADT’s implementation Programmer can use an ADT without knowing its implementation. 9/19/2018 CS 201

Typical Operations on Data Add data to a data collection Remove data from a data collection Ask questions about the data in a data collection. E.g., what is the value at a particular location. 9/19/2018 CS 201

Why ADT Hide the unnecessary details Help manage software complexity Easier software maintenance Functionalities are less likely to change Localised rather than global changes 9/19/2018 CS 201

Illustration 9/19/2018 CS 201

Linked Lists

Lists List: a finite sequence of data items a1; a2; a3; : : : an Lists are pervasive in computing e.g. class list, list of chars, list of events Typical operations: Creation Insert / remove an element Test for emptiness Find an element Current element / next / previous Find k-th element Print the entire list 9/19/2018 CS 201

Array-Based List Implementation One simple implementation is to use java arrays A sequence of n-elements Maximum size must be anticipated a priori. Internal variables: Maximum size maxSize (m) Current size currSize (n) Current index current Array of elements listArray n currSize a1 a2 a3 an listArray unused 1 2 n-1 m current 9/19/2018 CS 201

Inserting Into an Array While retrieval is very fast, insertion and deletion are very slow Insert has to shift upwards to create gap a1 a2 a7 a8 a4 a5 a6 a3 Step 1 : Shift upwards 8 Size arr Example : insert(3,it) Step 2 : Write into gap it Step 3 : Update Size 9 9/19/2018 CS 201

Coding class list { private int size private Object[] arr; public void insert(int j, Object it) { // pre : 1<=j<=size+1 for (i=size; i>=j; i=i-1) { arr[i+1]=arr[i]; }; // Step 1: Create gap arr[j]=it; // Step 2: Write to gap size = size + 1; // Step 3: Update size } 9/19/2018 CS 201

Deleting from an Array Delete has to shift downwards to close gap of deleted item Step 1 : Close Gap 9 a1 a2 it a7 a8 size a5 a6 a3 arr a4 Example: delete(5) Step 2 : Update Size 8 Not part of list 9/19/2018 CS 201

Coding public void delete(int j) { // pre : 1<=j<=size for (i=j+1; i<=size; i=i+1) { arr[i-i]=arr[i]; }; // Step1: Close gap size = size - 1; // Step 2: Update size } 9/19/2018 CS 201

Linked List Approach Main problem of array is deletion/insertion slow since it has to shift items in its contiguous memory Solution: linked list where items need not be contiguous with nodes of the form Sequence (list) of four items < a1,a2 ,a3 ,a4 > can be represented by: element next ai a1 a2 a3 a4 head represents null 9/19/2018 CS 201

Coding class ListNode { Object element; ListNode next; public ListNode(Object o) { element = o; next = null; } public ListNode(Object o,ListNode n) next = n; } } 9/19/2018 CS 201

Add elementz to list The earlier sequence can be built by: ListNode ptr4 = new ListNode(“a4”, null); ListNode ptr3 = new ListNode(“a3”, ptr4); ListNode ptr2 = new ListNode(“a2”, ptr3); ListNode head = new ListNode(“a1”, ptr2); ptr2 ptr3 ptr4 head a1 a2 a3 a4 9/19/2018 CS 201

Linked List ADT We can provide an ADT for linked-list. This can help hide unnecessary internal details a1 a2 a3 a4 head LinkedList addHead() deleteHead() LinkedList() retrieve(Head) isEmpty() 9/19/2018 CS 201

Sample Sequence of four items < a1,a2 ,a3 ,a4 > can be built, as follows: LinkedList list = new LinkedList(); list.addHead(“a4”); list.addHead(“a3”); list.addHead(“a2”); list.addHead(“a1”); head list a1 a2 a3 a4 9/19/2018 CS 201

Coding class LinkedList { protected ListNode head ; public LinkedList() {head = null; } public boolean isEmpty() {return (head == null); } public void addHead(Object o) {head = new ListNode(o,head); } public void deleteHead() throws ItemNotFound {if (head ==null) {throw new ItemNotFound(“DeleteHead fails”);} else head = head.next;} }; class ItemNotFound extends Exception { public ItemNotFound(String msg) {super(msg);} } 9/19/2018 CS 201

Linked List Iteration ADT To support better access to our linked-list, we propose to build a linked-list iteration ADT advance first isLast insertNext(o) LinkedListItr deleteNext retrieve a1 a2 a3 a4 head current 9/19/2018 CS 201

Declaration data structure access or change current pointer class LinkedListItr extends LinkedList{ private ListNode current; private boolean zeroflag; public LinkedListItr() {… } public void zeroth() { … } public void first() { … } public void advance() { … } public boolean isLast() { … } public boolean isInList() { … } public Object retrieve() { … } public void insertNext(Object o) { … } public void deleteNext() { … } } data structure access or change current pointer access or change nodes 9/19/2018 CS 201

Coding Zeroth Position (current == null) && (zeroflag==true) InList public void zeroth() // set position prior to first element { current = null; zeroflag = true; } Why zeroflag? – To distinguish “zeroth position” from “beyond list position” Zeroth Position (current == null) && (zeroflag==true) InList (current != null) Beyond List (current == null) && (zeroflag==false) 9/19/2018 CS 201

More coding public void first() throws ItemNotFound // set position to first element { current = head; zeroflag = false; if (current == null) {throw new ItemNotFound(“No first element”);}; } public void advance() // advance to next item {if (current != null) {current = current.next } else {if (zeroflag) {current = head; zeroflag = false;} else {} }; 9/19/2018 CS 201

More coding public boolean isLast() // check if it current is at the last node {if (current!=null) return (current.next == null); else return false; } public boolean isInList() // check if current is at some node (return (current != null); public Object retrieve() throws ItemNotFound // current object at current position { if (current!=null) { return current.element; } else { throw new ItemNotFound(“retrieve fails”); }; 9/19/2018 CS 201

Insertion ? temp head o current a1 a2 a3 a4 public void insertNext(Object o) throws ItemNotFound // insert after current position { ListNode temp; if (current!=null) {temp = new ListNode(o, current.next); current.next = temp;} else if (zeroflag) { head = new ListNode(o,head);} else {throw new ItemNotFound(“insert fails”);}; } ? temp o a1 a2 a3 a4 head current 9/19/2018 CS 201

Delete ? current head a1 a2 a3 a4 public void deleteNext() throws ItemNotFound // delete node after current position { if (current!=null) {if (current.next!=null) {current.next = current.next.next;} else {throw new ItemNotFound(“No Next Node to Delete”);}; } else if (zeroflag && head!=null) {head=head.next;} ? a1 a2 a3 a4 head current 9/19/2018 CS 201

Doubly Liked Lists Frequently, we need to traverse a sequence in BOTH directions efficiently Solution : Use doubly-linked list where each node has two pointers next forward traversal Doubly Linked List. x1 x4 x2 head x3 backward traversal prev 9/19/2018 CS 201

Circular Linked Lists May need to cycle through a list repeatedly, e.g. round robin system for a shared resource Solution : Have the last node point to the first node x1 x2 xn . . . Circular Linked List. head 9/19/2018 CS 201

Stacks

What is a Stack? A stack is a list with the restriction that insertions and deletions can be performed in only one position, namely, the end of the list, called the top. The operations: push (insert) and pop (delete) pop push(o) 3 Top 2 7 6 9/19/2018 CS 201

Stack ADT Interface We can use Java Interface to specify Stack ADT Interface interface Stack { boolean isEmpty(); // return true if empty void push(Object o); // insert o into stack void pop() throws Underflow; // remove most recent item void popAll(); // remove all items from stack Object top() throws Underflow; // retrieve most recent item Object topAndPop() throws Underflow; // return & remove most recent item } 9/19/2018 CS 201

Sample Operation s d top e c b a Stack s = makeStack(); s.push(“a”); s.push(“b”); s.push(“c”); d=s.top(); s.pop(); s.push(“e”); s top d e c b a 9/19/2018 CS 201

Implementation by Linked Lists Can use LinkedListItr as implementation of stack StackLL lst Top of Stack = Front of Linked-List LinkedListItr a1 a2 a3 a4 head current 9/19/2018 CS 201

Code Class StackLL implements Stack { private LinkedListItr lst; public StackLL() { lst = new LinkedListItr(); } public Stack makeStack() { return new StackLL(); } public boolean isEmpty() // return true if empty { return lst.isEmpty(); }; public void push(Object o) // add o into the stack { lst.addHead(o); } public void pop() throws Underflow // remove most recent item { try {lst.deleteHead();} catch (ItemNotFound e) {throw new Underflow(“pop fails - empty stack”)}; } 9/19/2018 CS 201

More code public Object top() throws Underflow; // retrieve most recent item { try { lst.first(); return lst.retrieve(); } catch (ItemNotFound e) {throw new Underflow(“top fails - empty stack”);}; } public Object topAndPop() throws Underflow; // return & remove most recent item Object p=lst.retrieve(); lst.deleteHead(); return p; {throw new Underflow(“topAndPop fails - empty stack”);}; 9/19/2018 CS 201

Implementation by Array Can use Array with a top index pointer as an implementation of stack top StackAr arr 1 7 8 9 2 3 4 5 6 A B C D E F G 9/19/2018 CS 201

Code class StackAr implements Stack { private Object [] arr; private int top; private int maxSize; private final int initSize = 1000; private final int increment = 1000; public StackAr() { arr = new Object[initSize]; top = -1; maxSize=initSize } public Stack makeStack() { return new StackAr(); } public boolean isEmpty() { return (top<0); } private boolean isFull() { return (top>=maxSize); } 9/19/2018 CS 201

More code public void push(Object o) // insert o { top++; if (this.isFull()) this.enlargeArr() ; arr[top]=o; } private void enlargeArr() // enlarge the array {int newSize = maxSize+increment; Object [] barr = new Object[newSize]; for (int j=0;j<maxSize;j++) {barr[j]=arr[j];}; maxSize = newSize; arr = barr; } 9/19/2018 CS 201

More code public void pop() throws Underflow { if (!this.isEmpty()) {top--;} else {throw new Underflow(“pop fails - empty stack”);}; } public Object top() throws Underflow { if (!this.isEmpty()) {return arr[top];} else {throw new Underflow(“top fails - empty stack”);}; public Object topAndPop() throws Underflow { if (!this.isEmpty()) { Object t = arr[top]; top--; return t; }; else {throw new Underflow(“top&pop fails - empty stack”);}; 9/19/2018 CS 201

Applications Many application areas use stacks: line editing bracket matching postfix calculation function call stack 9/19/2018 CS 201

Line Editing A line editor would place characters read into a buffer but may use a backspace symbol (denoted by ) to do error correction Refined Task read in a line correct the errors via backspace print the corrected line in reverse Input : Corrected Input : Reversed Output : abc_defgh2klpqrwxyz abc_defg2klpwxyz zyxwplk2gfed_cba 9/19/2018 CS 201

The Procedure Initialize a new stack For each character read: if it is a backspace, pop out last char entered if not a backspace, push the char into stack To print in reverse, pop out each char for output Stack z h r Input : fghryz Corrected Input : Reversed Output : g y fyz f zyf 9/19/2018 CS 201

Bracket Matching Problem Ensures that pairs of brackets are properly matched An Example: {a,(b+f[4])*3,d+f[5]} Bad Examples: (..)..) // too many closing brackets (..(..) // too many open brackets [..(..]..) // mismatched brackets 9/19/2018 CS 201

Informal Procedure Initialize the stack to empty For every char read if open bracket then push onto stack if close bracket, then return & remove most recent item from the stack if doesn’t match then flag error if non-bracket, skip the char read Stack [ ] Example {a,(b+f[4])*3,d+f[5]} ( [ ] ) { } 9/19/2018 CS 201

Postfix Calculator Computation of arithmetic expressions can be efficiently carried out in Postfix notation with the help of a stack. Infix - arg1 op arg2 Prefix - op arg1 arg2 Postfix - arg1 arg2 op (2*3)+4 2*(3+4) 2 3 4 + * 2*3+4 infix 2 3 * 4 + postfix 9/19/2018 CS 201

Informal Procedure Stack Initialise stack For each item read. If it is an operand, push on the stack If it is an operator, pop arguments from stack; perform operation; push result onto the stack Stack Expr 2 3 4 + * s.push(2) s.push(3) s.push(4) arg2=s.topAndPop() arg1=s.topAndPop() s.push(arg1+arg2) 4 3+4=7 3 arg2=s.topAndPop() arg1=s.topAndPop() s.push(arg1*arg2) 2*7=14 2 9/19/2018 CS 201

Summary The ADT stack operations have a last-in, first-out (LIFO) behavior Stack has many applications algorithms that operate on algebraic expressions a strong relationship between recursion and stacks exists Stack can be implemented by arrays and linked lists 9/19/2018 CS 201

Queues

What is a Queue? Like stacks, queues are lists. With a queue, however, insertion is done at one end whereas deletion is done at the other end. Queues implement the FIFO (first-in first-out) policy. E.g., a printer/job queue! Two basic operations of queues: dequeue: remove an element from front enqueue: add an element at the back dequeue enqueue 9/19/2018 CS 201

Queue ADT Queues implement the FIFO (first-in first-out) policy An example is the printer/job queue! enqueue(o) dequeue() isEmpty() getFront() createQueue() 9/19/2018 CS 201

Sample Operation q front back d a b c e Queue q = createQueue(); q.enqueue(“a”); q.enqueue(“b”); q.enqueue(“c”); d=q.getFront(); q.dequeue(); q.enqueue(“e”); q front back d a b c e 9/19/2018 CS 201

Java Interface We can also use Java Interface to specify Queue ADT Interface. This provides a more abstract mechanism to support simultaneous implementations interface Queue { void enqueue(Object o) // insert o to back of Q void dequeue() throws Underflow; // remove oldest item Object getFront() throws Underflow; // retrieve oldest item boolean isEmpty(); // checks if Q is empty } 9/19/2018 CS 201

Implementation of Queue (Linked List) Can use LinkedListItr as underlying implementation of Queues Queue lst LinkedListItr addTail a1 a2 a3 a4 head current tail 9/19/2018 CS 201

Code class QueueLL implements Queue { private LinkedListItr lst; public QueueLL() { lst = new LinkedListItr(); } public static Queue makeQueue() // return a new empty queue { return new QueueLL(); } public void enqueue(Object o) // add o to back of queue { lst.addTail(o); } public void dequeue() throws Underflow // remove oldest item { try {lst.deleteHead(); catch (ItemNotFound e) {throw new Underflow(“dequeue fails - empty q”;}; } 9/19/2018 CS 201

More code public Object getFront() throws Underflow; // retrieve oldest item { try { lst.first(); return lst.retrieve(); } catch (ItemNotFound e) {throw new Underflow(“getFront fails - empty queue”);}; } public boolean isEmpty() // return true if empty { return lst.isEmpty(); } 9/19/2018 CS 201

Implementation of Queue (Array) Can use Array with front and back pointers as implementation of queue Queue arr 1 7 8 9 2 3 4 5 6 A B C D E F G front back 9/19/2018 CS 201

Circular Array A B C D E F G front back front back A B C D E F G To implement queue, it is best to view arrays as circular structure 1 7 8 9 2 3 4 5 6 A B C D E F G front back front back A B C D E F G 1 7 8 9 2 3 4 5 6 Circular view of arrays. 9/19/2018 CS 201

How to Advance Both front & back pointers should make advancement until they reach end of the array. Then, they should re-point to beginning of the array front = adv(front); back = adv(back); public static int adv(int p) { return ((p+1) % maxsize); } Alternatively, use modular arithmetic: mod operator public static int adv(int p) { int r = p+1; if (r<maxsize) return r; else return 0; } upper bound of the array 9/19/2018 CS 201

Sample q F=front B=back F B a e b c d F F F B B B B B Queue q = QueueAR.makeQueue(); q.enqueue(“a”); q.enqueue(“b”); q.enqueue(“c”); q.dequeue(); q.enqueue(“d”); q.enqueue(“e”); q F=front B=back F B a e b c d F F F B B B B B 9/19/2018 CS 201

Checking for Full/Empty State What does (F==B) denote? c d e B F f Queue Full State F B Queue Empty State size size 4 c d e B F Alternative - Leave a Deliberate Gap! No need for size field. Full Case : (adv(B)==F) 9/19/2018 CS 201

Code class QueueAr implements Queue { private Object [] arr; private int front,back; private int maxSize; private final int initSize = 1000; private final int increment = 1000; public QueueAr() {arr = new Object[initSize]; front = 0; back=0; } public static Queue makeQueue() {return new QueueAr(); } public boolean isEmpty() // check if queue is empty { return (front==back); } private boolean isFull() // check if queue overflows { return (adv(back)==front); } } 9/19/2018 CS 201

More code public void enqueue(Object o) // add o to back of queue { if (this.isFull()) this.enlarge(); arr[back]=o; back=adv(back); } private void enlargeArr() // enlarge the array {int newSize = maxSize+increment; Object [] barr = new Object[newSize]; for (int j=0,k=front;j<=maxSize;j++,k=adv(k)) {barr[j]=arr[k];}; front=0; back=maxSize-1; maxSize = newSize; arr = barr; } 9/19/2018 CS 201

More code public void dequeue() throws Underflow { if this.isEmpty() {throw new Underflow(“dequeue fails - empty q”);} else front=adv(front); } public Object getFront() throws Underflow {throw new Underflow(“getFront fails - empty q”);} else return arr[front]; 9/19/2018 CS 201

Summary The definition of the queue operations gives the ADT queue first-in, first-out (FIFO) behavior The queue can be implemented by linked lists or by arrays There are many applications Printer queues, Telecommunication queues, Simulations, Etc. 9/19/2018 CS 201