The document discusses stacks and queues as data structures. It defines a stack as a last-in, first-out (LIFO) structure and queue as first-in, first-out (FIFO). The key operations for each are described, including push, pop for stacks and add, serve for queues. Implementations using arrays are presented for both. Cyclic queues are also covered, which allow queues to wrap around a fixed-size array.
1. Lecture 5
• Stack (Array Implementation)
• Queue (Array Implementation )
FIST, Multi Media University
2. 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
3. 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.
FIST, Multi Media University Operations...
4. Stack
E TOP
F
D
EG - Plates
G
C Books
B (LIFO)
A
FIST, Multi Media University
5. 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 ( )
checks whether stackUniversity TOP = maxstacksize
FIST, Multi Media
is full,
6. 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( ); Multi Media University };
FIST,
7. Stack
How to Push?
Void stack :: Push(int data2add)
{ if (!Full( ))
{ TOP++;
Stackelement[TOP] = data2add;
}
else
cout << “Stack is Full!!!”<<endl;
} FIST, Multi Media University
8. Stack
How to Pop?
Int stack :: Pop( )
{int data2remove;
if (!Empty( ))
{ data2remove = Stackelement[TOP];
TOP--; return data2remove; }
else{ cout << “Stack is Empty!!!”<<endl;
return 0;
} }
FIST, Multi Media University
9. Stack
How to check for full?
Int Stack :: Full( )
{
if (TOP==9) return 1;
else return 0;
}
FIST, Multi Media University
10. Stack
How to check for Empty?
Int Stack :: Empty( )
{
if (TOP== -1) return 1;
else return 0;
}
FIST, Multi Media University
12. 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
13. 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 Parameters
because , when a function
Caller’s state information
terminates, the function with
which to resume execution is Local variables
the last function whose
activation record was saved. Temporary storage
FIST, Multi Media University
14. Stack
Activation Record
Function4
Function3 Function3
Function2 Function2
Function1 Function1
FIST, Multi Media University
15. 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
16. 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
17. 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
18. 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
19. 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
20. implementation
i=0;
while(str[i]!='0') //push the string into stack
{ st.push(str[i]);
i++;
}
i=0;
while(str[i]!='0') //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
}
21. 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
22. 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
23. Queue
EG - Bank Counter
Front Rear
FIST, Multi Media University
24. 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
25. 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
26. implementation
How to check for full?
Int Queue :: Full( )
{
if (Tail == 3) return 1;
else return 0;
}
FIST, Multi Media University
27. implementation
How to check for Empty?
Int Queue :: Empty( )
{
if (Tail == -1) return 1;
else return 0;
}
FIST, Multi Media University
28. implementation
How to Add?
Void Queue :: Addend(int data2add)
{ if (!Full( ))
{ Tail++;
Queueelement[Tail] = data2add;
}
else
cout << “Queue is Full!!!”<<endl;
} FIST, Multi Media University
29. implementation
How to Delete?
int Queue :: Serve( )
{int data2remove;
if (!Empty( ))
{ data2remove = Queueelement[0];
for ( i =0;i<Tail;i++)
Queueelement[i] = Queueelement[i+1]
Tail--; return data2remove; }
else{ cout << “Queue is Empty!!!”<<endl;
Methods
FIST, Multi Media University
31. 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 Queues is simulation
FIST, Multi Media University
33. 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
34. 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 arrayMulti Media University
FIST, as listed below:
35. Cyclic Queue
Action Head Tail
0 3
Delete 1 3
Insert 1 4
Delete 2 4 Head Tail
Insert 2 5
Insert 2 0
Delete 3 0
Delete 4 0 0 1 2 3 4 5
FIST, Multi Media University
36. Cyclic Queue
Action Head Tail
Insert 4 1 Head Tail
Delete 5 1
Insert 5 2
Delete 0 2
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
37. 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
38. 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 Tail Head
0 1 2 3 4 5 0 1 2 3 4 5
Empty Queue
Only one elementFIST, Multi Media University
Queue
39. 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
40. 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
41. 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, Multi Media University
Queue"<<endl; }