Lecture 5 Stack Array Implementation Queue Array Implementation

  • Slides: 41
Download presentation
Lecture 5 • Stack (Array Implementation) • Queue (Array Implementation ) FIST, Multi Media

Lecture 5 • Stack (Array Implementation) • Queue (Array Implementation ) FIST, Multi Media University

Stack What is a Stack? 1) It is a data structure for storing some

Stack What is a Stack? 1) It is a data structure for storing some values 2) It is an ADT. 3) Implemented using Arrays or Linked List 4) used in Operating System and in System Programming FIST, Multi Media University

Stack How to Store and Retrieve from a Stack? 1) All Insertions ( Storing)

Stack How to Store and Retrieve from a Stack? 1) All Insertions ( Storing) and Deletions (Removing) of entries are made at one end called the TOP of Stack 2) Last item added to a stack (PUSH) is always the first that will be removed (POP) from the stack. 3) This property is called Last In First Out also known as LIFO 4) The operations are done with a single pointer to the top of list of elements. Operations. . . FIST, Multi Media University

Stack F D G TOP E EG - Plates C Books B (LIFO) A

Stack F D G TOP E EG - Plates C Books B (LIFO) A FIST, Multi Media University

Operations • There are Four operations : 1) Push ( ) used to add

Operations • There are Four operations : 1) Push ( ) used to add the data at the top of the stack. Check whether the stack is full or not 2) Pop ( ) used to remove data at the top of the stack. Check whether the stack is empty or not 3) Empty ( ) Checks whether stack is empty, TOP = -1 4) Full ( ) FIST, Multistack Media University checks whether is full, TOP = maxstacksize

Stack - implementation • Uses ARRAY to represent a stack Class stack { private

Stack - implementation • Uses ARRAY to represent a stack Class stack { private : int stackelement[10], TOP; public: stack( ) { top = -1} int Empty( ); void push(int); int Full ( ); int Pop( ); FIST, Multi Media University };

Stack How to Push? Void stack : : Push(int data 2 add) { if

Stack How to Push? Void stack : : Push(int data 2 add) { if (!Full( )) { TOP++; Stackelement[TOP] = data 2 add; } else cout << “Stack is Full!!!”<<endl; } FIST, Multi Media University

Stack How to Pop? Int stack : : Pop( ) {int data 2 remove;

Stack How to Pop? Int stack : : Pop( ) {int data 2 remove; if (!Empty( )) { data 2 remove = Stackelement[TOP]; TOP--; return data 2 remove; } else{ cout << “Stack is Empty!!!”<<endl; return 0; } } FIST, Multi Media University

Stack How to check for full? Int Stack : : Full( ) { if

Stack How to check for full? Int Stack : : Full( ) { if (TOP==9) return 1; else return 0; } FIST, Multi Media University

Stack How to check for Empty? Int Stack : : Empty( ) { if

Stack How to check for Empty? Int Stack : : Empty( ) { if (TOP== -1) return 1; else return 0; } FIST, Multi Media University

Stack Void main( ) { stackobj; stackobj. Push(23); stackobj. Push(46); stackobj. Push(37); stackobj. Push(10);

Stack Void main( ) { stackobj; stackobj. Push(23); stackobj. Push(46); stackobj. Push(37); stackobj. Push(10); stackobj. Push(55); cout << stackobj. Pop( ); } 55 FIST, Multi Media University 10 37 46 23 55 10

Applications of Stack We shall see two applications of the stack 1) Use of

Applications of Stack We shall see two applications of the stack 1) Use of Stacks in Function Calls 2) Palindrome Checking FIST, Multi Media University

Use of Stacks in Function Calls • Whenever a function begins execution an ACTIVATION

Use of Stacks in Function Calls • Whenever a function begins execution an ACTIVATION RECORD (Stack Frame) is created • to store the current environment for that function which includes This structure should LIFO because , when a function terminates, the function with which to resume execution is the last function whose activation record was saved. Parameters Caller’s state information Local variables Temporary storage FIST, Multi Media University

Stack Activation Record Function 4 Function 3 Function 2 Function 1 FIST, Multi Media

Stack Activation Record Function 4 Function 3 Function 2 Function 1 FIST, Multi Media University

Palindrome Checking What is a palindrome? A palindrome is a word/sentence that is the

Palindrome Checking What is a palindrome? A palindrome is a word/sentence that is the same if read both ways. You might have noticed that if you push some characters into a stack and pop them out , they will appear in reverse order. So Stacks are used for this purpose. FIST, Multi Media University

Palindrome · Here are some palindromes MALAYALAM (a south Indian language) RATS LIVE ON

Palindrome · Here are some palindromes MALAYALAM (a south Indian language) RATS LIVE ON NO EVIL STAR DAD POP RADAR STEP ON NO PETS MADAM FIST, Multi Media University

implementation #include <iostream. h> #include <string. h> class ADTstack { char stack[10]; int topstack;

implementation #include <iostream. h> #include <string. h> class ADTstack { char stack[10]; int topstack; public: ADTstack( ) {topstack = -1; }; int empty() {if (topstack == -1) return 1; else return 0; }; int full() {if (topstack == 9) return 1; else return 0; }; void push(char num) { if (!full()) { topstack++; stack[topstack] = num; } else cout<<" Stack is Full"<<endl; } FIST, Multi Media University

implementation char pop( ) { char num; if (!empty()) { num = stack[topstack]; topstack--;

implementation char pop( ) { char num; if (!empty()) { num = stack[topstack]; topstack--; return num; } else {cout<<"Stack is Empty"<<endl; return '0'; } } }; FIST, Multi Media University

implementation void main() { ADTstack st; char str[10]; int palin, l, i; cout<<"type in

implementation void main() { ADTstack st; char str[10]; int palin, l, i; cout<<"type in a string to check if it is a palindrome"<<endl; cin>>str; l=strlen(str); if (l==1) {palin=1; } //all strings with 1 character are palindromes else { FIST, Multi Media University

implementation i=0; while(str[i]!='�') //push the string into stack { st. push(str[i]); i++; } i=0;

implementation i=0; while(str[i]!='') //push the string into stack { st. push(str[i]); i++; } i=0; while(str[i]!='') //pop the string and compare with original { if (str[i]!=st. pop()) {palin=0; break; } i++; } } if (palin==0) cout<<"Not Palindrome"<<endl; else cout<<"Palindrome"<<endl; FIST, Multi Media University }

Queue What is a Queue? 1) It is a data structure for storing some

Queue What is a Queue? 1) It is a data structure for storing some values 2) It is an ADT. 3) Implemented using Arrays or Linked List FIST, Multi Media University

Queue How to Store and Retrieve from a Queue? 1) A Data Structure in

Queue How to Store and Retrieve from a Queue? 1) A Data Structure in which all Additions to the list are made at one end, and all Deletions from the list are made at other end. 2) First item added to a queue (ADD) is always the first that will be removed (REMOVE) from the queue. 3) This property is called First In First Out also known as FIFO 4) It can be maintained with two pointers namely FRONT (REMOVE) and REAR ( ADD). FIST, Multi Media University

Queue EG - Bank Counter Front Rear FIST, Multi Media University

Queue EG - Bank Counter Front Rear FIST, Multi Media University

Operations There are Four operations : 1) Addend ( ) used to add the

Operations There are Four operations : 1) Addend ( ) used to add the data at the Tail of the Queue. Check whether the Queue is full or not 2) Serve ( ) used to remove data at the top of the stack. Check whether the Queue is empty or not 3) Empty ( ) Checks whether Queue is empty, Tail = -1 4) Full ( ) checks whether Queue is full, Tail = maxqueuesize FIST, Multi Media University

implementation Uses ARRAY to represent a Queue Class Queue { private : int Queueelement[4],

implementation Uses ARRAY to represent a Queue Class Queue { private : int Queueelement[4], Head , Tail; public: int Empty( ); Queue( ) { Head =0 ; Tail = -1} int Full ( ); }; void Addend(int); int Serve( ); FIST, Multi Media University

implementation How to check for full? Int Queue : : Full( ) { if

implementation How to check for full? Int Queue : : Full( ) { if (Tail == 3) return 1; else return 0; } FIST, Multi Media University

implementation How to check for Empty? Int Queue : : Empty( ) { if

implementation How to check for Empty? Int Queue : : Empty( ) { if (Tail == -1) return 1; else return 0; } FIST, Multi Media University

implementation How to Add? Void Queue : : Addend(int data 2 add) { if

implementation How to Add? Void Queue : : Addend(int data 2 add) { if (!Full( )) { Tail++; Queueelement[Tail] = data 2 add; } else cout << “Queue is Full!!!”<<endl; } FIST, Multi Media University

implementation How to Delete? int Queue : : Serve( ) {int data 2 remove;

implementation How to Delete? int Queue : : Serve( ) {int data 2 remove; if (!Empty( )) { data 2 remove = Queueelement[0]; for ( i =0; i<Tail; i++) Queueelement[i] = Queueelement[i+1] Tail--; return data 2 remove; } else{ cout << “Queue is Empty!!!”<<endl; Methods FIST, Multi Media University return 0; } }

implementation Void main( ) { Queue queueobj; queueobj. Addend(23); queueobj. Addend(46); queueobj. Addend(37); queueobj.

implementation Void main( ) { Queue queueobj; queueobj. Addend(23); queueobj. Addend(46); queueobj. Addend(37); queueobj. Addend(10); queueobj. Addend(55); cout << queueobj. Serve(); } 23 46 23 FIST, Multi Media University 37 46 10 55

Serving Three Methods of Serving 1) increment head to 1 runs out of storage

Serving Three Methods of Serving 1) increment head to 1 runs out of storage 2) when the first person has be served the remaining persons in the Queue shuffle forward one place. Can serve unlimited number of persons as long as the queue never exceeds the maximum size 3) Use cyclic queues One of the application of. Multi Queues is simulation FIST, Media University

Lecture 6 • Cyclic Queues FIST, Multi Media University

Lecture 6 • Cyclic Queues FIST, Multi Media University

Cyclic Queues What is a Cyclic Queue? we need to imagine that the array

Cyclic Queues What is a Cyclic Queue? we need to imagine that the array allocated to the queue is not linear but cyclic, i. e. that it forms a circle. EG: So that if for instance 10 elements are allocated to the queue with the element positions running from 0 to 9 then when the tail gets to position 9 the next element to be added can go to position 0 providing that position has already been “served” (vacant). . Thus the two problems of the queues are solved. FIST, Multi Media University

Cyclic Queue Example: Queue implemented using an array of size 6 with 4 data

Cyclic Queue Example: Queue implemented using an array of size 6 with 4 data items inserted in to the queue Head Tail 0 1 2 3 4 5 The following actions will cause the “head” and “tail” to move through the array as Media listed below: FIST, Multi University

Cyclic Queue Action Delete Insert Delete Head 0 1 1 2 2 2 3

Cyclic Queue Action Delete Insert Delete Head 0 1 1 2 2 2 3 4 Tail 3 3 4 4 Head 5 0 0 1 FIST, Multi Media University Tail 2 3 4 5

Cyclic Queue Action Insert Delete Head 4 5 5 0 Tail 1 Head 1

Cyclic Queue Action Insert Delete Head 4 5 5 0 Tail 1 Head 1 2 2 Tail 0 1 2 3 4 5 Note: A Cyclic queue will always be of fixed size (say n) and the size information must be available to update the pointers “head” and “tail”. FIST, Multi Media University

Cyclic Queue The wrapping around can be achieved by updating the pointers as follows:

Cyclic Queue The wrapping around can be achieved by updating the pointers as follows: Delete: head = (head+1) % n Insert: tail = (tail + 1) % n i. e. , Whenever a pointer is incremented, take modulo n. The above operations is needed to check if the queue is empty or full. FIST, Multi Media University

Cyclic Queue Consider when there is only one element in the queue • In

Cyclic Queue Consider when there is only one element in the queue • In this case, both the pointers coincide (head == tail) • The queue becomes empty when the element is deleted Head , Tail Head 0 1 2 3 4 5 Empty Queue Only one element. FIST, Queue Multi Media University

Cyclic Queue For an empty queue, we have the condition head = (tail +

Cyclic Queue For an empty queue, we have the condition head = (tail + 1) % n The above condition is also satisfied when the queue is full We resolve the ambiguity between two cases if the condition head = (tail+1)% n is satisfied up on deleting an item from the queue, then queue is empty if the condition head = (tail + 1) % n is satisfied up on inserting an item in to the queue, then queue is full. FIST, Multi Media University

implementation How to Add? void Addend(int x) { if (!Full()) { tail=(tail+1)%MAX; a[tail]=x; count++;

implementation How to Add? void Addend(int x) { if (!Full()) { tail=(tail+1)%MAX; a[tail]=x; count++; cout<<x<<" added to the queue"<<endl; } else cout<<"Full Queue"<<endl; } FIST, Multi Media University

implementation How to Delete? int Serve() { int x; if (!Empty()) { x=a[head]; head=(head+1)%MAX;

implementation How to Delete? int Serve() { int x; if (!Empty()) { x=a[head]; head=(head+1)%MAX; count--; cout<<x<<" served from the queue"<<endl; return x; } else cout<<"Empty FIST, Queue"<<endl; } Multi Media University