รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 1 Stack & Queue Lecturers : Boontee Kruatrachue Room no. 913 Kritawan Siriboon Room no. 913 Text : Data Structures & Algorithm Analysis in C, C++,… Mark Allen Weiss, Addison Wesley
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 2 Stack Lecturers : Boontee Kruatrachue Room no. 913 Kritawan Siriboon Room no. 913 Text : Data Structures & Algorithm Analysis in C, C++,… Mark Allen Weiss, Addison Wesley
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 3 Stack An ordered collection of items. One end is called a top of the stack. Items are inserted onto the top of the stack. => push Items are deleted from the top of the stack. => pop top pop push LIFO List ( LastInFirstOut )
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 4 Stack Implementations 1.Array Implementation 2.Linked Stack
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 5 Array Implementation How can we make a stack? What is it? An ordered collection of items. An array What data type can we use? 1.What can keep many items? 2.What can make items in ordered? Now, we have place for items of a stack. Next, can stack operations be done?
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 6 Stack Top With array, can we do stack operations, push, pop,...? Where can we push? Why? At index We push on the top. int top; What type of data can be top? Where is the top element in each picture?At index 2,3. We need a data structure for top.
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 7 Stack Data Structure typedef char T; #define SIZE 6 //constant SIZE T item[SIZE]; int top; itemABC CBACBA top= top =
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 8 Stack Operations
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 9 push( ) CBACBA top = DCBADCBA top = 3 ++ top; item[top] = i; push D item[++top] = i; What if the array is full ? Check Overflow
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 10 pop( ) DCBADCBA top=3 DCBADCBA pop D int oldTop = top; top --; return item[oldTop]; return item[top--]; oldTop= top= What if the array is empty ? Check Underflow Need to erase D? No. Only change top. No. Only change top.
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 11 isEmpty( ) CBACBA top = C B A top = -1 return (top==-1); Try pop until empty What happens when stack empty? top =
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 12 init( ) ++ top; item[top] = ‘A’; top = test : push(A) A Before pushing, a stack is empty top = -1
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 13 isFull( ) top = SIZE What happens when stack full? top = DCBADCBA return (top==SIZE);
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 14 Stack Implementations 1.Array Implementation 2.Linked Stack
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 15 top Check if it support every operations. Linked Stack
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 16 Queue Lecturers : Boontee Kruatrachue Room no. 913 Kritawan Siriboon Room no. 913 Text : Data Structures & Algorithm Analysis in C, C++,… Mark Allen Weiss, Addison Wesley
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 17 Queue An ordered collection of items. There are 2 ends, head (front) and tail (rear). Items are inserted to the head (front). => enQueue Items are deleted from the tail (rear). => deQueue แถวคอ ย FIFO List FirstInFirstOut FIFO List FirstInFirstOut front / head rear/tail enQueue deQueue
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 18 Queue Implementations 1.Linked Queue 2.Array Implementation
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 19 front rear Support every operations ? Linked Queue frontrear front rear How do they link? Every operations ?
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 20 Queue Implementations 1.Linked Queue 2.Array Implementation
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 21 C D E f r Array Implementation Not full. But cannot enqueue ! A B No place left at the rear side ! Can we enqueue at the other side ? Think as an array is a circle. Straight array C D E 1 0 f = = r Circular array
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 22 Array Implementation r++ does not work ! C D E 1 0 f = = r#define SIZE 5 if (r == (SIZE -1)) r = 0; else r++; void increase(int &r) Also f++ does not work ! if (i == (SIZE -1)) i = 0; else i++; void increase(int &i)
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 23 isEmpty( ), isFull( ) r = f = r r = f = f A B r f f r f f isEmpty( ), can’t just check r>f ? or f>r ? It’s circular. Also can’t for isFull( ) E
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 24 isEmpty( ) / isFull( ) Solution #define MAX 50 typedef int T; struct queue{ T data[MAX]; int front, rear; int count; }; enQ deQ init isFull isEmpty count++ count-- count = 0 count == SIZE count == 0
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 25 Queue Operations 1.enQ 2.isFull 3.deQ 4.isEmpty 5.init
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 26 Algorithms
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 27 Stack Applications Parenthesis Matching Evaluate Postfix Expression Infix to Postfix Conversion (Reverse Polish Notation) Function Call (clearly see in recursion)
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 28 Parenthesis Matching Are the parenthesises correct? (a+b-c)*[d+e]/{f*(g+h)} [(a+b-c}*[d+e]/{f*(g+h)} (a+b-c *[d+e]/{f*(g+h) }
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 29 Parenthesis Matching Match ? Count : [ { ( ] } ) ? No. We can do it since we were young. How ? [ (a+b)*{ (d+e)-3}]
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 30 Parenthesis Matching Simulate what you do. [ (a+b)*{ (d+e)-3}] random 1.Random position (until found match?). 2.Scan out both ways. 3.if Left side = open paren & Right side = close paren. 4. If match : 5.Check out. 6.goto 2 7. else end process. 8.else goto 1 / / / / ↑ ↑ // / / How to program this algorithm ? What data structures are needed ? Difficult !
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 31 Parenthesis Matching [ ( ) { ( ) }] [ (a+b)*{ (d+e)-3}] Clear out what are irrelevant. Parenthesis matching’s nature is stack. How ? The close parenthesis matches the previous open parenthesis. [ ( ) { ( ) }]
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 32 Parenthesis Matching [ (a+b)*{ (d+e)-3}] Scan left to right. Open paren : push to a stack. Close paren : check if match ? with top in stack. match pop out. else done : not match ! ↑ ( { [ (
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 33 Warnier-Orr Diagram Design Tool Paren matching Init empty stack s Scan (not EOF && not error) read ch ch = open paren + ch = close paren s.push(ch) s.empty() + s.empty() error =true(no match-open-paren) open = s.pop() error = true (missmatch) notmatch(open,ch) error=false error + error no match-open-paren / missmatch MATCH open paren exceed s.empty() + s.empty() ch = non_paren match(open,ch) [ (a+b)*{ (d+e)-3}] ( [
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 34 Warnier-Orr Diagram Design Tool Paren matching Init empty stack s Scan (not EOF && not error) read ch ch = open paren + ch = close paren s.push(ch) s.empty() + s.empty() error =true(no match-open-paren) open = s.pop() error = true (missmatch) notmatch(open,ch) error=false error + error no match-open-paren / missmatch MATCH open paren exceed s.empty() + s.empty()
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 35 Stack Applications Parenthesis Matching Evaluate Postfix Expression Infix to Postfix Conversion (Reverse Polish Notation) Function Call (clearly see in recursion)
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 36 Evaluate Postfix Notation Infix Form Prefix Form Postfix Form (Polish notation) a + b + a b a b + a + b * c + a * b ca b c * +
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue * * = ? input: 6523 input: + Push : 6, 5, 2, 3 o2 <- pop#1 o1 <- pop#2 push S What ‘s next ? Evaluate Postfix Notation S
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue * * = ? input: 6523 Push : s input: + pop#1 → 3 pop#2 → 2 5 push s input: 88 push input: * pop#1 → 8 40 pop#2 → 5 5 push 5*86 input: - pop#1 → 40 pop#2 → push input: 3 push input: + pop#1 → 3 pop#2 → push input: * pop#1 → -32 pop#2 → 6 push 6 *
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 39 Stack Applications Parenthesis Matching Evaluate Postfix Expression Infix to Postfix Conversion (Reverse Polish Notation) Function Call (clearly see in recursion)
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 40 Infix to Postfix Conversion ab*c+a output stack b c+ * a*b+c ===>
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 41 Infix to Postfix Conversion a*b+c ---- > input: stack: output: a*b+ca a*b+c *a a*b+c *ab a*b+c +ab* a*b+c +ab*c a*b+cab*c+ ab*c+
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 42 Infix to Postfix Conversion a+b*c ---- > input: stack: output: a+b*ca a+b*c +a a+b*c +ab * * a+b*c +abc a+b*cabc*+ abc*+
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 43 input:stack: output: a+b*c-da a+b*c-d +a a+b*c-d +ab * * a+b*c-d +abc a+b*c-d -abc*+ a+b*c-d -abc*+d a+b*c-dabc*+d- abc*+d- a+b*c-d => Infix to Postfix Conversion
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 44 Infix to Postfix Conversion a+b*c-(d/e+f)*g +ab * a+b*c-(d/e+f)*g +abc a+b*c-(d/e+f)*g -abc*+ ( a+b*c-(d/e+f)*g -abc*+d / ( a+b*c-(d/e+f)*g -abc*+de abc*+de/f+g*- a+b*c-(d/e+f)*g =>
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 45 Infix to Postfix Conversion (cont.) a+b*c-(d/e+f)*g => / ( a+b*c-(d/e+f)*g -abc*+de + ( a+b*c-(d/e+f)*g -abc*+de/f a+b*c-(d/e+f)*g -abc*+de/f+ * a+b*c-(d/e+f)*g -abc*+de/f+g a+b*c-(d/e+f)*g -abc*+de/f+g*- abc*+de/f+g*-
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 46 Stack Applications Parenthesis Matching Evaluate Postfix Expression Infix to Postfix Conversion (Reverse Polish Notation) Function Call (clearly see in recursion)
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 47 void sth(int i){ int x = 3; i = x; } void f() { int k = 8; sth(k); sth( 5); Add1(&k); Ad1(k); } 3 int i = 5; 53 //pass data k f( ) 8 sth( ) i 8 x 3 //pass address //pass by reference Ad1( ) Add1( ) p *p 3 Pass : by Value, Pass Address &. int *p = &k; void Add1(int *p) { (*p)++; } 9 10 void Ad1(int& ref){ ref++; } ref int& ref = k; pass by reference is tecnically the same as pass address but for writing convenience (no dereference) int& ref = k; ref is another name of k int i = k; int i = 5; by Reference (C++) Stack frame Stack top
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 48 Struct Stack void push (int item[], int *pTop, T d ){ (*pTop)++; item[*pTop] = d; } #define SIZE 6 typedef int T; #define SIZE 6 typedef int T; typedef struct stack { T item[SIZE]; int top; } stack; void push (stack *sp, T d){ if (!isFull(*sp)) sp->item[++sp->top] = d; } int main(){ T item[SIZE], item2[SIZE]; int top, top2; init(&top); push( item, &top,5); int main() { stack s, s1; init(&s); push(&s, 5);
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 49 Lab Questions
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 50 Common Misunderstanding int *p = &i; int *p; p = &i; int *s, t, *u; int *s; int t; int *u; *p = &i; t is int s and u are pointers int *q = p; int *q; q = p; q points to what p points to q p i 8 59
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 51 Lab : Scramble List
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 52 Bottom Up h Lift it. Take the bottom up. Take the bottom up. I I love you very much C++ Where ? h2 t2 t1 Try to print h2. Opps!
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 53 h t1 h2 t2 Riffle Shuffle Riffle Shuffle each node of each packet from the top. put the rest at the back of the result packet. Riffle Shuffle each node of each packet from the top. put the rest at the back of the result packet h t1 h2 t Lift up to 2 packets.
รศ. ดร. บุญธีร์ เครือตราชู รศ. กฤตวัน ศิริบูรณ์ KMITL Data Structures & Algorithms : Stack & Queue 54 h t h2 t2 h t h2 t2 Lift up to 2 packets. Riffle Shuffle Riffle Shuffle each node of each packet from the top. put the rest at the back of the result packet. Riffle Shuffle each node of each packet from the top. put the rest at the back of the result packet.