Unit 3
Unit 3
Stack is a linear data structure in which the insertion and deletion operations are performed at only one end. In a
stack, adding and removing of elements are performed at single position which is known as "top". That means,
new element is added at top of the stack and an element is removed from the top of the stack. In stack, the
insertion and deletion operations are performed based on LIFO (Last In First Out) principle.
In a stack, the insertion operation is performed using a function called "push" and deletion operation is
performed using a function called"pop".
In the figure, PUSH and POP operations are performed at top position in the stack. That means, both the
insertion and deletion operations are performed at one end (i.e., at Top)
Stack is a linear data structure in which the operations are performed based on LIFO principle.
"A Collection of similar data items in which both insertion and deletion operations are performed based
on LIFO principle".
Example
If we want to create a stack by inserting 10,45,12,16,35 and 50. Then 10 becomes the bottom most element and
50 is the top most element. Top is at 50 as shown in the image below...
Operations on a Stack
1
Stack data structure can be implement in two ways. They are as follows...
1. Using Array
When stack is implemented using array, that stack can organize only limited number of elements. When stack is
implemented using linked list, that stack can organize unlimited number of elements.
A stack data structure can be implemented using one dimensional array, can store only fixed number of data
values. This implementation is very simple, just define a one dimensional array of specific size and insert or
delete the values into that array by using LIFO principle with the help of a variable 'top'. Initially top is set to -
1 or 0.
Whenever we want to insert a value into the stack, increment the top value by one and then insert. Whenever we
want to delete a value from the stack, then delete the top value and decrement the top value by one.
Step 1: Include all the header files which are used in the program and define a constant 'SIZE' with
specific value.
Step 3: Create a one dimensional array with fixed size (int stack[SIZE])
Step 4: Define a integer variable 'top' and initialize with '-1'. (int top = -1)
Step 5: In main method display menu with list of operations and make suitable function calls to perform
operation selected by the user on the stack.
In a stack, push() is a function used to insert an element into the stack. In a stack, the new element is always
inserted at top position. Push function takes one integer value as parameter and inserts that value into the stack.
Step 2: If it is FULL, then display "Stack is FULL!!! Insertion is not possible!!!" and terminate the
function.
Step 3: If it is NOT FULL, then increment top value by one (top++) and set stack[top] to value
(stack[top] = value).
In a stack, pop() is a function used to delete an element from the stack. In a stack, the element is always deleted
from top position. Pop function does not take any value as parameter.
Step 2: If it is EMPTY, then display "Stack is EMPTY!!! Deletion is not possible!!!" and terminate
the function.
Step 3: If it is NOT EMPTY, then delete stack[top] and decrement top value by one (top--).
2
display() - Displays the elements of a Stack
Step 2: If it is EMPTY, then display "Stack is EMPTY!!!" and terminate the function.
Step 3: If it is NOT EMPTY, then define a variable 'i' and initialize with top. Display stack[i] value
and decrement i value by one (i--).
The major problem with the stack implemented using array is the amount of data must be specified at the
beginning of the implementation itself. It is not suitable, when we don't know the size of data which we are
going to use.
A stack data structure can be implemented by using linked list data structure can be used for unlimited number
of values. That means, stack implemented using linked list works for variable size of data.
In linked list implementation of a stack, every new element is inserted as 'top' element. That means every newly
inserted element is pointed by 'top'. Whenever we want to remove an element from the stack, simply remove
the node which is pointed by 'top' by moving 'top' to its next node in the list. The next field of the first element
must be always NULL.
Example
3
In above example, the last inserted node is 99 and the first inserted node is 25. The order of elements inserted is
25, 32,50 and 99.
Operations
To implement stack using linked list, we need to set the following things before implementing actual operations.
Step 1: Include all the header files which are used in the program. And declare all the user defined
functions.
Step 2: Define a 'Node' structure with two members data and next.
Step 4: Implement the main method by displaying Menu with list of operations and make suitable
function calls in the main method.
Step 2: If it is Empty, then display "Stack is Empty!!! Deletion is not possible!!!" and terminate the
function
Step 3: If it is Not Empty, then define a Node pointer 'temp' and set it to 'top'.
Step 2: If it is Empty, then display 'Stack is Empty!!!' and terminate the function.
Step 3: If it is Not Empty, then define a Node pointer 'temp' and initialize with top.
4
Step 4: Display 'temp → data --->' and move it to the next node. Repeat the same until temp reaches to
the first node in the stack (temp → next != NULL).
Expressions
operator is a symbol which performs a particular task like arithmetic operation or logical operation or
conditional operation etc.
Operands are the values on which the operators can perform the task. Here operand can be a direct value or
variable or address of memory location.
Expression Types
Based on the operator position, expressions are divided into THREE types. They are as follows...
1. Infix Expression
2. Postfix Expression
3. Prefix Expression
Infix Expression
5
In infix expression, operator is used in between operands.
Example
Postfix Expression
In postfix expression, operator is used after operands. We can say that "Operator follows the Operands".
Example
Prefix Expression
In prefix expression, operator is used before operands. We can say that "Operands follows the Operator".
Example
Expression Conversion
Any expression can be represented using three types of expressions (Infix, Postfix and Prefix). We can also
convert one type of expression to another type of expression like Infix to Postfix, Infix to Prefix, Postfix to
Prefix and vice versa.
3. Convert each operator into required type of expression (Postfix or Prefix) in the same order.
Example
D=A+B*C
6
Step 4: Convert the next operator + ----- D = A BC* +
Example
(A+B)*(C-D)
7
Postfix Expression Evaluation
8
Queue ADT
Queue is a linear data structure in which the insertion and deletion operations are performed at two different
ends. In a queue data structure, adding and removing of elements are performed at two different positions. The
insertion is performed at one end and deletion is performed at other end.
ion which is known as 'rear' and the deletion operation is performed at a position which is known as 'front'. In
queue data structure, the insertion and deletion operations are performed based on FIFO (First In First
Out) principle.
In a queue data structure, the insertion operation is performed using a function called "enQueue()" and deletion
operation is performed using a function called "deQueue()".
Queue data structure is a linear data structure in which the operations are performed based on FIFO
principle.
"Queue data structure is a collection of similar data items in which insertion and deletion operations are
performed based on FIFO principle".
Example
Operations on a Queue
1. Using Array
Initially both 'front' and 'rear' are set to -1. Whenever, we want to insert a new value into the queue, increment
'rear' value by one and then insert at that position. Whenever we want to delete a value from the queue, then
increment 'front' value by one and then display the value at 'front' position as deleted element.
9
Queue Operations using Array
Step 1: Include all the header files which are used in the program and define a constant 'SIZE' with
specific value.
Step 2: Declare all the user defined functions which are used in queue implementation.
Step 3: Create a one dimensional array with above defined SIZE (int queue[SIZE])
Step 4: Define two integer variables 'front' and 'rear' and initialize both with '-1'.
Step 5: Then implement main method by displaying menu of operations list and make suitable function
calls to perform operation selected by the user on queue.
In a queue data structure, enQueue() is a function used to insert a new element into the queue. In a queue, the
new element is always inserted at rear position. The enQueue() function takes one integer value as parameter
and inserts that value into the queue.
Step 2: If it is FULL, then display "Queue is FULL!!! Insertion is not possible!!!" and terminate the
function.
Step 3: If it is NOT FULL, then increment rear value by one (rear++) and set queue[rear] = value.
In a queue data structure, deQueue() is a function used to delete an element from the queue. In a queue, the
element is always deleted from front position. The deQueue() function does not take any value as parameter.
Step 2: If it is EMPTY, then display "Queue is EMPTY!!! Deletion is not possible!!!" and terminate
the function.
Step 3: If it is NOT EMPTY, then increment the front value by one (front ++). Then
display queue[front] as deleted element. Then check whether both front and rear are equal
(front == rear), if it TRUE, then set both front and rear to '-1' (front = rear = -1).
Step 2: If it is EMPTY, then display "Queue is EMPTY!!!" and terminate the function.
Step 3: If it is NOT EMPTY, then define an integer variable 'i' and set 'i = front+1'.
Step 3: Display 'queue[i]' value and increment 'i' value by one (i++). Repeat the same until 'i' value is
equal to rear (i <= rear)
10
The queue which is implemented using linked list can work for unlimited number of values. That means, queue
using linked list can work for variable size of data (No need to fix the size at beginning of the implementation).
The Queue implemented using linked list can organize as many data values as we want.
In linked list implementation of a queue, the last inserted node is always pointed by 'rear' and the first node is
always pointed by 'front'.
Example
In above example, the last inserted node is 50 and it is pointed by 'rear' and the first inserted node is 10 and it is
pointed by 'front'. The order of elements inserted is 10, 15, 22 and 50.
Operations
To implement queue using linked list, we need to set the following things before implementing actual
operations.
Step 1: Include all the header files which are used in the program. And declare all the user defined
functions.
Step 2: Define a 'Node' structure with two members data and next.
Step 3: Define two Node pointers 'front' and 'rear' and set both to NULL.
Step 4: Implement the main method by displaying Menu of list of operations and make suitable
function calls in the main method to perform user selected operation.
Step 1: Create a newNode with given value and set 'newNode → next' to NULL.
Step 4: If it is Not Empty then, set rear → next = newNode and rear = newNode.
Step 2: If it is Empty, then display "Queue is Empty!!! Deletion is not possible!!!" and terminate
from the function
Step 3: If it is Not Empty then, define a Node pointer 'temp' and set it to 'front'.
Step 4: Then set 'front = front → next' and delete 'temp' (free(temp)).
Step 2: If it is Empty then, display 'Queue is Empty!!!' and terminate the function.
Step 3: If it is Not Empty then, define a Node pointer 'temp' and initialize with front.
11
Step 4: Display 'temp → data --->' and move it to the next node. Repeat the same until 'temp' reaches
to 'rear' (temp → next !=NULL).
Circular Queue
In a normal Queue Data Structure, we can insert elements until queue becomes full. But once if queue becomes
full, we cannot insert the next element until all the elements are deleted from the queue. For example consider
the queue below...
Now consider the following situation after deleting three elements from the queue...
This situation also says that Queue is full and we cannot insert the new element because, 'rear' is still at last
position. Even though we have empty positions in the queue we cannot make use of them to insert new element.
This is the major problem in normal queue data structure. To overcome this problem we use circular queue data
structure.
Circular Queue is a linear data structure in which the operations are performed based on FIFO (First In
First Out) principle and the last position is connected back to the first position to make a circle.
To implement a circular queue data structure using array, perform the following steps before we implement
actual operations.
Step 1: Include all the header files which are used in the program and define a constant 'SIZE' with
specific value.
Step 2: Declare all user defined functions used in circular queue implementation.
12
Step 3: Create a one dimensional array with above defined SIZE (int cQueue[SIZE])
Step 4: Define two integer variables 'front' and 'rear' and initialize both with '-1'.
Step 5: Implement main method by displaying menu of operations list and make suitable function calls
to perform operation selected by the user on circular queue.
enQueue() is a function which is used to insert an element into the circular queue. In a circular queue, the new
element is always inserted at rear position. The enQueue() function takes one integer value as parameter and
inserts that value into the circular queue.
Step 1: Check whether queue is FULL. ((rear == SIZE-1 && front == 0) || (front == rear+1))
Step 2: If it is FULL, then display "Queue is FULL!!! Insertion is not possible!!!" and terminate the
function.
Step 3: If it is NOT FULL, then check rear == SIZE - 1 && front != 0 if it is TRUE, then set
rear = -1.
Step 4: Increment rear value by one (rear++), set queue[rear] = value and check 'front == -1'
deQueue() is a function used to delete an element from the circular queue. In a circular queue, the element is
always deleted from front position. The deQueue() function doesn't take any value as parameter.
Step 2: If it is EMPTY, then display "Queue is EMPTY!!! Deletion is not possible!!!" and terminate
the function.
Step 3: If it is NOT EMPTY, then display queue[front] as deleted element and increment
the front value by one (front ++). Then check whether front == SIZE, if it is TRUE, then set
front = 0. Then check whether both front - 1 and rear are equal (front -1 ==rear), if it TRUE,
then set both front and rear to '-1' (front = rear = -1).
We can use the following steps to display the elements of a circular queue...
Step 2: If it is EMPTY, then display "Queue is EMPTY!!!" and terminate the function.
Step 3: If it is NOT EMPTY, then define an integer variable 'i' and set 'i = front'.
Step 4: Check whether 'front <= rear', if it is TRUE, then display 'queue[i]' value and increment 'i'
value by one (i++). Repeat the same until 'i <= rear' becomes FALSE.
Step 5: If 'front <= rear' is FALSE, then display 'queue[i]' value and increment 'i' value by one (i++).
Repeat the same until'i <= SIZE - 1' becomes FALSE.
13
Step 6: Set i to 0.
Step 7: Again display 'cQueue[i]' value and increment i value by one (i++). Repeat the same until
Double Ended Queue is also a Queue data structure in which the insertion and deletion operations are
performed at both the ends (front and rear). That means, we can insert at both front and rear positions and can
delete from both front and rear positions.
In input restricted double ended queue, the insertion operation is performed at only one end and deletion
operation is performed at both the ends.
In output restricted double ended queue, the deletion operation is performed at only one end and insertion
operation is performed at both the ends.
14
PUSH
Push ( ):
Description: Here STACK is an array with MAX locations. TOP points to the top most element and ITEM is
2. Print: Overflow
3. Else
[End of If]
7. Exit
POP
Pop ( ):
Description: Here STACK is an array with MAX locations. TOP points to the top most element.
2. Print: Underflow
3. Else
[End of If]
7. Exit
http://www.w3professors.com/data-structure-algorithms/delete-item-from-queue-dsa
15
INFIX TO POSTFIX EXPRESSION COVERSION
Description: Here I is an arithmetic expression written in infix notation and P is the equivalent postfix
3. Scan I from left to right and repeat step 4 for each element of I until the stack becomes empty.
(i) Pop from stack and add to P each operator which has the same or higher precedence then the scanned
operator.
(i) Pop from stack and add to P each operator until a left parenthesis is encountered.
5.Exit.
POSTFIX EVALUATION
Evaluate ( ):
2. Scan P from left to right and repeat steps 3 & 4 for each element of P until “)” is encountered.
is encountered then:
(a) Pop the top two elements from stack, where A is the top element and B is the next to top element.
16
6. Exit.
Description: Here QUEUE is an array with N locations. FRONT and REAR points to the front and rear
of the QUEUE. ITEM is the value to be inserted.
1. If (REAR == N) Then [Check for overflow]
2. Print: Overflow
3. Else
4. If (FRONT and REAR == 0) Then [Check if QUEUE is empty]
(a) Set FRONT = 1
(b) Set REAR = 1
5. Else
6. Set REAR = REAR + 1 [Increment REAR by 1]
[End of Step 4 If]
7. QUEUE[REAR] = ITEM
8. Print: ITEM inserted
[End of Step 1 If]
9. Exit
Description: Here QUEUE is an array with N locations. FRONT and REAR points to the front and rear
of the QUEUE.
1. If (FRONT == 0) Then [Check for underflow]
2. Print: Underflow
3. Else
4. ITEM = QUEUE[FRONT]
5. If (FRONT == REAR) Then [Check if only one element is left]
(a) Set FRONT = 0
(b) Set REAR = 0
6. Else
7. Set FRONT = FRONT + 1 [Increment FRONT by 1]
[End of Step 5 If]
8. Print: ITEM deleted
[End of Step 1 If]
9. Exit
18
Insert Element into Circular Queue
Description: Here QUEUE is an array with N locations. FRONT and REAR points to the front and
rear elements of the QUEUE. ITEM is the value to be inserted.
1. If (FRONT == 1 and REAR == N) or (FRONT == REAR + 1) Then
2. Print: Overflow
3. Else
4. If (REAR == 0) Then [Check if QUEUE is empty]
(a) Set FRONT = 1
(b) Set REAR = 1
5. Else If (REAR == N) Then [If REAR reaches end if QUEUE]
6. Set REAR = 1
7. Else
8. Set REAR = REAR + 1 [Increment REAR by 1]
[End of Step 4 If]
9. Set QUEUE[REAR] = ITEM
10. Print: ITEM inserted
[End of Step 1 If]
11. Exit
Description: Here QUEUE is an array with N locations. FRONT and REAR points to the front and
rear elements of the QUEUE.
19