You are on page 1of 28

CHAPTER - 1 - STACK ADT

INTRODUCTION

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. It follows Last-In-First-Out (LIFO)
principle.

OPERATIONS ON STACK

The fundamental operations on a stack are:

 Push - which is equivalent to insert


 Pop - which deletes the most recently inserted element
 Peek - return top of stack
 MakeEmpty – create an empty stack
 IsEmpty – check whether a stack is empty
 IsFull – check whether a stack is full

Fig. 12.1 Stack model: input to a stack is by push, output is by pop

Top  50
 40
 30
 20
 10

Fig. 12.2 Stack model: only the top element is accessible

PUSH

 The process of inserting a new element to the top of the stack is called push operation.
 For every push operation the top is incremented by 1.

  
  Top 
 20
Top  10 10
Top Empty Stack After After
inserting an inserting an
element 10 element 20

Fig. 12.3 Push Operations


POP

 The process of deleting an element from the top of stack is called pop operation.
 After every pop operation the top pointer is decremented by 1.


Top  30  
 20 
Top  20 
 10  10 
Top  10
Initial Stack After the After the
element 30 element 20
is deleted is deleted
Fig. 3.4 Pop Operations

EXCEPTIONAL CONDITIONS

Overflow

Attempt to insert an element when the stack is full is said to be overflow.

Top  50
 40
 30
 20
 10

Fig. 12.5 Full Stack (Size = 5)

Underflow

Attempt to delete an element when the stack is empty is said to be underflow.

Top 

Fig. 12.6 Empty Stack

IMPLEMENTATION OF STACKS

Stack can be implemented using:

 Array
 Linked list
REVIEW QUESTIONS

1. Define stack. What are the operations performed on a stack?


2. List out the operations on stack.
3. What are the different ways to implement stack?
4. What are the exception conditions of a stack?
5. What is a top pointer? Explain its significance.

CHAPTER - 2 - ARRAY IMPLEMENTATION OF STACK

INTRODUCTION

In this implementation each stack is associated with a top pointer, which is -1 for an empty
stack.

Push

To push an element X onto the stack, top pointer is incremented by 1 and then set:

Stack [top] = X.

Pop

To pop an element from the stack, the Stack [top] value is returned and the top pointer is
decremented by 1.

STACK FULL

Routine to Check whether a Stack is Full

int IsFull()
{
if(top == MAX - 1)
return 1;
else
return 0
}
STACK EMPTY

Routine to Check whether a Stack is Empty

int IsEmpty()
{
if(top == -1)
return 1;
else
return 0;
}

PUSH
Routine to Push an Element on to the Stack

void Push(int ele)


{
if(IsFull())
printf("Stack Overflow...!\n");
else
{
top = top + 1;
Stack[top] = ele;
}
}

POP
Routine to Pop an Element from the Stack

void Pop()
{
if(IsEmpty())
printf("Stack Underflow...!\n");
else
{
printf("%d\n", Stack[top]);
top = top - 1;
}
}

PEEK

Routine to Return Top of Stack

void Top()
{
if(IsEmpty())
printf("Stack Underflow...!\n");
else
printf("%d\n", Stack[top]);
}
Routine to Display Stack Elements

void Display()
{
int i;
if(IsEmpty())
printf("Stack Underflow...!\n");

else
{

for(i = top; i >= 0; i--)


printf("%d\t", Stack[i]);
printf("\n");

}
}

REVIEW QUESTIONS

1. How do you push and pop elements in an array stack?


2. Explain push and pop operations with the help of examples.

CHAPTER - 3 - LINKED LIST IMPLEMENTATION OF STACK

INTRODUCTION

In this implementation:

 Push operation is performed by inserting an element at the front of the list.


 Pop operation is performed by deleting at the front of the list.
 Top operation returns the element at the front of the list.

EMPTY LIST

Algorithm to Check whether a Stack is Empty

IsEmpty()

Step 1 : Start.
Step 2 : If List = NULL goto Step 3 else goto Step 4.
Step 3 : Return 1 and Stop.
Step 4 : Return 0 and Stop.
Step 5 : Stop.

PUSH

Example

The general idea is shown in Figure. The dashed line represents the old pointer.
The push is NewNode
implemented as
an insertion into
the front of a
linked list, where List
the front serves
as the top of the
stack.

Push(10)

Push(20)
NewNode

List

Push(30)
NewNode

List
POP

Pop as a deletion from the front of the list.

Example

List
Fig. Initial Stack

Pop()

TempNode

List
TOP

Top is performed by examining the element in the first position of the list.

Example

List
Fig. Initial Stack

Top()

List

DISPLAY

Example

List

REVIEW QUESTIONS

1. How do you push and pop elements in a linked stack?


CHAPTER - 4 - APPLICATIONS OF STACK

APPLICATIONS OF STACK

Some of the applications of stack are:

 Balancing symbols
 Infix to postfix conversion
 Evaluating postfix expression
 Function calls
 Towers of Hanoi
 8 queens problem

REVIEW QUESTIONS

1. State the applications of stack data structure.

CHAPTER 5- BALANCING SYMBOLS

INTRODUCTION

Compilers check your programs for syntax errors, but frequently a lack of one symbol (such
as a missing brace or comment starter) will cause the compiler to spill out a hundred lines of
diagnostics without identifying the real error.

A useful tool in this situation is a program that checks whether everything is balanced. Thus,
every right brace, bracket, and parenthesis must correspond to their left counterparts. The sequence
[()] is legal, but [(]) is wrong. Obviously, it is not worthwhile writing a huge program for this, but it
turns out that it is easy to check these things. For simplicity, we will just check for balancing of
parentheses, brackets, and braces and ignore any other character that appears.

The simple algorithm uses a stack and is as follows:


Make an empty stack.

Read characters until end of input.

If the character read is not a symbol to be balanced, ignore it.

If the character is an opening symbol like (, [, {, push it onto the stack.

If it is a closing symbol like ), ], }, then if the stack is empty report an error as “Missing
opening symbol”. Otherwise, pop the stack.
 If the symbol popped is not the corresponding opening symbol, then report an error as
“Mismatched symbol”.
 At end of input, if the stack is not empty report an error as “Missing closing symbol”.
Otherwise, report as “Symbols are balanced”.
EXAMPLES

16.2.1 (a+b)

( a + b )
( ( ( (

Stack is empty  Symbols are balanced.


16.2.2 ((a+b)

( ( a + b )
( ( ( (
( ( ( ( ( (

Stack is not empty  Missing closing symbol.


16.2.3 (a+b))

( a + b )
( ( ( (

Stack is empty  Missing opening symbol.

16.2.4 (a+b]

( a + b ]
( ( ( (

Not corresponding to the opening symbol  Mismatched symbol.

CHAPTER 6 - NOTATIONS TO REPRESENT ARITHMETIC EXPRESSIONS

INTRODUCTION

There are 3 different ways of representing the algebraic expression. They are:

 Infix notation
 Postfix notation
 Prefix notation

INFIX NOTATION

In infix notation, the arithmetic operator appears between the two operands to which it is
being applied.

For example:

A/B+C

POSTFIX NOTATION

In postfix notation, the arithmetic operator appears directly after the two operands to which it
applies. It is also called as reverse polish notation.

For example:

((A/B) + C)  AB/C+
PREFIX NOTATION

In prefix notation, the arithmetic operator is placed before the two operands to which it
applies. It is also called as polish notation.

For example:

((A/B) + C)  +/ABC

REVIEW QUESTIONS

1. What are the different types of notations to represent arithmetic expressions?


2. What is an infix notation?
3. What is a postfix notation?
4. What is a prefix notation?

CHAPTER - 7 - INFIXES TO POSTFIX CONVERSION

INTRODUCTION

To evaluate an arithmetic expression, first convert the given infix expression to postfix
expression and then evaluate the postfix expression using stack.

INFIX TO POSTFIX CONVERSION

Not only can a stack be used to evaluate a postfix expression, but we can also use a stack to
convert an expression in standard form (otherwise known as infix) into postfix.

The algorithm uses a stack and is as follows:

 Make an empty stack.


 Read the infix expression one character at a time until it encounters end of expression.
 If the character is an operand, place it onto the output.
 If the character is an operator, push it onto the stack. If the stack operator has a higher or
equal priority than input operator, then pop that operator from the stack and place it onto
the output.
 If the character is a left parenthesis, push it onto the stack.
 If the character is a right parenthesis, pop all the operators from the stack till it
encounters left parenthesis, discard both the parenthesis in the output.
EXAMPLE-I

a+b*c+(d*e+f)*g

First, the symbol a is read, so it is passed through to the output. Then '+' is read and pushed
onto the stack. Next b is read and passed through to the output. The state of affairs at this juncture is
as follows:

Next a '*' is read. The top entry on the operator stack has lower precedence than '*', so
nothing is output and '*' is put on the stack. Next, c is read and output. Thus far, we have

The next symbol is a '+'. Checking the stack, we find that we will pop a '*' and place it on the
output, pop the other '+', which is not of lower but equal priority, on the stack, and then push the '+'.
The next symbol read is an '(', which, being of highest precedence, is placed on the stack.
Then d is read and output.

We continue by reading a '*'. Since open parentheses do not get removed except when a
closed parenthesis is being processed, there is no output. Next, e is read and output.

The next symbol read is a '+'. We pop and output '*' and then push '+'. Then we read and
output.

Now we read a ')', so the stack is emptied back to the '('. We output a '+'.

We read a '*' next; it is pushed onto the stack. Then g is read and output.

The input is now empty, so we pop and output symbols from the stack until it is empty.
EXAMPLE-II
a * b + (c – d / e)

a
Stack Output

* a
Stack Output

* ab
Stack Output

+ ab*
Stack Output

(
+ ab*
Stack Output

(
+ ab*c
Stack Output

-
(
+ ab*c
Stack Output
-
(
+ ab*cd
Stack Output

/
-
(
+ ab*cd
Stack Output

/
-
(
+ ab*cde
Stack Output

ab*cde/-+
Stack Output

REVIEW QUESTIONS

1. How will you evaluate an arithmetic expression?


2. Write the algorithm for infix to postfix conversion.
3. Convert the infix expression a + b * c + (d * e + f)* g to its equivalent postfix expression.
4. 19. What are the postfix and prefix forms of the expression? A
+ B * (C – D) / (P – R)
5. Convert the expression ((A + B) * C - (D - E) ^ (F + G)) to equivalent Prefix and Postfix
notations.
6. Given the infix for an expression, write its prefix a*b/c+d.
CHAPTER - 8 - EVALUATING POSTFIX EXPRESSION

INTRODUCTION

The easiest way to do this is to use a stack. The algorithm uses a stack and is as follows:

 Make an empty stack.


 Read the postfix expression one character at a time until it encounters end of expression.
 If the character is an operand, push its associated value onto the stack.
 If the character is an operator, pop two values from the stack, apply the operator to them
and push the result onto the stack.

EXAMPLE-I

ab*cde/-+

Let us consider the symbols a, b, c, d, e had the associated values:

a4 b5 c5 d8 e2

2
a b * c d 8 8 / 4
5 5 e 5 5
5
4 4 20 20 20 20 20

- +
1
20 21

REVIEW QUESTIONS

1. How will you evaluate a postfix expression?


CHAPTER - 9 - QUEUE ADT

INTRODUCTION

A queue is list with the restrictions that insertion is done at one end (rear), whereas deletion is
performed at the other end (front). It follows First-In-First-Out (FIFO) principle.

Example: Waiting line in a reservation counter.

OPERATIONS ON QUEUE

The basic operations on a queue are:

 Enqueue - which inserts an element at the end of the list (called rear).
 Dequeue - which deletes (and returns) the element at the start of the list (known as
front).

Fig. 20.1 shows the abstract model of a queue.

Fig. 20.1 Model of a Queue

Fig. 20.2 Queue of People

Fig. 20.3 Queue Implementation

None 0 1 2 3 4
 
F R

Fig. 20.3 Empty Queue (Initial state)


ENQUEUE

 The process of inserting a new element on to the rear of the queue is called enqueue
operation.
 For every enqueue operation the rear pointer is incremented by 1.

10 20 30

0 1 2 3 4
 
F R
Fig. 20.4 Enqueue Operations
10.4 DEQUEUE

 The process of deleting an element from the front of queue is called dequeue operation.
 After every dequeue operation the front pointer is incremented by 1.

20 30

0 1 2 3 4
 
F R
Fig. 20.5 Dequeue Operations

EXCEPTIONAL CONDITIONS
Overflow

Attempt to insert an element when the queue is full is said to be overflow.

10 20 30 40 50

0 1 2 3 4
 
F R
Fig. 20.6 Full Queue (Size = 5)
Underflow
Attempt to delete an element, when the queue is empty is said to be underflow.

None 0 1 2 3 4
 
F R Fig. 20.7 Empty Queue
IMPLEMENTATION OF QUEUE

Queue can be implemented using:

 Array
 Linked list

APPLICATIONS OF QUEUE

The applications of queue data structure are:

 Batch processing in an operating system


 To implement priority queues
 Mathematics user queuing theory
 Computer networks where the server takes the jobs of the client as per the queue strategy

REVIEW QUESTIONS

1. Define a queue model. (or) Define Queue.


2. List out the operations on queue.
3. What are the different ways to implement queue?
4. What are the exception conditions of a queue?
5. What are front and rear pointers? Explain their significance.
6. What are the different application areas of queue data structure?

CHAPTER - 10 - ARRAY IMPLEMENTATION OF QUEUE

INTRODUCTION
In this implementation each queue is associated with two pointers namely front and rear,
which is -1 for an empty queue.

Enqueue

To insert an element X onto the queue, the rear pointer is incremented by 1 and then
set:
Queue[rear] = X.

Dequeue
To delete an element from the queue, the Queue[front] value is returned and the front pointer
is incremented by 1.
QUEUE FULL

Routine to Check whether a Queue is Full

int IsFull()
{
if(rear == MAX - 1)
return 1;
else
return 0;
}
QUEUE EMPTY

Routine to whether a Queue is Empty

int IsEmpty()
{
if(front == -1)
return 1;
else
return 0;
}

ENQUEUE

Routine to Enqueue an Element on to the Queue

void Enqueue(int ele)


{
if(IsFull())
printf("Queue is Overflow...!\n");
else
{
rear = rear + 1;
Queue[rear] = ele;
if(front == -1)
front = 0;
}
}

DEQUEUE

Routine to Dequeue an Element from the Queue

void Dequeue()
{
if(IsEmpty())
printf("Queue is Underflow...!\n");
else
{
printf("%d\n", Queue[front]);
if(front == rear)
front = rear = -1;
else
front = front + 1;
}
}
DISPLAY

Routine to Display Queue Elements

void Display()
{
int i;
if(IsEmpty())
printf("Queue is Underflow...!\n");
else
{
for(i = front; i <= rear; i++)
printf("%d\t", Queue[i]);
printf("\n");
}
}
REVIEW QUESTIONS

1. How do you enqueue and dequeue elements in an array queue?


2. Write down a function to insert an element into a queue, in which the
queue is implemented as an array.
CHAPTER - 11 - LINKED LIST IMPLEMENTATION OF QUEUE

INTRODUCTION

In this implementation:

 Enqueue operation is performed by inserting an element at the end of the list.


 Dequeue operation is performed by deleting at the front of the list.

EMPTY LIST

Algorithm to whether a Queue is Empty

IsEmpty(List)
Step 1 : Start.
Step 2 : If List = NULL goto Step 3 else goto Step 4.
Step 3 : Return 1 and Stop.
Step 4 : Return 0 and Stop.
Step 5 : Stop.

ENQUEUE

The enqueue is implemented as an insertion into the end of a linked list.

Example

The general idea is shown in Figure.

Enqueue(10)
NewNode

Front
Rear
Enqueue(20)
NewNode

Front Rear
Enqueue(30)
NewNode

Front Rear
Algorithm to Enqueue an Element on to the queue

Enqueue(e)

Step 1 : Start.
Step 2 : Set NewNode = addressof(Queue).
Step 3 : Set NewNodeElement = e.
Step 4 : Set NewNodeNext = NULL.
Step 5 : If Rear = NULL, then goto Step 6 else goto Step 7.
Step 6 : Set Front = Rear = NewNode and goto Step 9.
Step 7 : Set RearNext = NewNode.
Step 8 : Set Rear = NewNode.
Step 9 : Stop.

DEQUEUE

Dequeue as a deletion from the front of the list.

Example

Front Rear
Fig. Initial Queue

Dequeue()
TempNode

Front Rear

Algorithm to Dequeue an Element from the Queue

Dequque()

Step 1 : Start.
Step 2 : If IsEmpty(Front) = True, then goto Step 3 else goto Step 4. Step
3 : Display “Queue is Underflow…!” and goto Step 10.
Step 4 : Set TempNode = Front.
Step 5 : If Front = Rear goto Step 6 else goto Step 7.
Step 6 : Set Front = Rear = NULL and goto Step 8.
Step 7 : Set Front = FrontNext.
Step 8 : Display TempNodeElement.
Step 9 : Delete TempNode.
Step 10: Stop.
DISPLAY

Example

Front Rear

Algorithm to Display Queue Elements

Display(List)

Step 1 : Start.
Step 2 : If IsEmpty(Front) = TRUE goto Step 3 else goto Step 4.
Step 3 : Display “Queue is Underflow…!” and goto Step 8.
Step 4 : Set Position = Front.
Step 5 : Repeat the Steps 6-7 until Position != NULL.
Step 6 : Display PositionElement.
Step 7 : Set Position = PositionNext.
Step 8 : Stop.

REVIEW QUESTIONS

1. How do you enqueue and dequeue elements in a linked list queue?


2. Write down a function to insert an element into a queue, in which the queue is implemented as a
linked list.
CHAPTER - 12 - CIRCULAR QUEUE

INTRODUCTION

A circular queue is a queue whose start and end locations are logically connected with each
other. That means, the start location comes after the end location. If we continue to add elements in
a circular queue till its end location, then after the end location has been filled, the next element will
be added at the beginning of the queue.

Fig. 23.1 shows the logical representation of a circular queue.

Fig. 23.1 Circular Queue

As we can see in Fig. 23.2, the start location of the queue comes after its end location. Thus,
if the queue is filled till its capacity, i.e., the end location, then the start location will be checked for
space, and if it is empty, the new element will be added there.

Figure shows the different states of a circular queue during insert and delete operations.

Fig. 23.2 Inserting and deleting elements in a circular queue

Advantages

Circular queues remove one of the main disadvantages of array implemented queues in
which a lot of memory space is wasted due to inefficient utilization.
QUEUE FULL

Algorithm to Check whether a Queue is Full

IsFull()

Step 1 : Start.
Step 2 : If front = (rear + 1) % MAX goto Step 3 else goto Step 4.
Step 3 : Return 1 and Stop.
Step 4 : Return 0. Step
5 : Stop.

Algorithm to whether a Queue is Empty

IsEmpty()

Step 1 : Start.
Step 2 : If front = -1 goto Step 3 else goto Step 4.
Step 3 : Return 1 and Stop.
Step 4 : Return 0. Step
5 : Stop.
ENQUEUE

Algorithm to Enqueue an Element on to the Queue

Enqueue(ele)

Step 1 : Start.
Step 2 : If IsFull() = True goto Step 3 else goto Step 4.
Step 3 : Display message “Queue is Overflow…!” and goto Step 8.
Step 4 : Set rear = (rear + 1) % MAX.
Step 5 : Set CQueue[rear] = ele.
Step 6 : If front = -1 goto Step 7 else goto Step 8.
Step 7 : Set front = 0.
Step 8 : Stop.

DEQUEUE

Algorithm to Dequeue an Element from the Queue

Dequeue()

Step 1 : Start.
Step 2 : If IsEmpty() = True goto Step 3 else goto Step 4.
Step 3 : Display message “Queue is Underflow…!” and goto Step 8. Step
4 : Display CQueue[front].
Step 5 : If front = rear goto Step 6 else goto Step 7.
Step 6 : Set front = rear = -1 and goto Step 8.
Step 7 : Set front = (front + 1) % MAX.
Step 8 : Stop.
DISPLAY

Algorithm to Display Queue Elements

Display()

Step 1 : Start.
Step 2 : If IsEmpty() = True goto Step 3 else goto Step 4.
Step 3 : Display message “Queue is Underflow…!” and goto Step 9. Step
4 : Set i = front.
Step 5 : Repeat Steps 6 to 7 while i != rear.
Step 6 : Display CQueue[i].
Step 7 : Set i = (i + 1) % MAX.
Step 8 : Display CQueue[i].
Step 9 : Stop.

REVIEW QUESTIONS

1. Define circular queue.


2. What is the advantage of circular queue?
CHAPTER - 13 - DOUBLE ENDED QUEUE

INTRODUCTION

A double-ended queue is a special type of queue that allows insertion and deletion of
elements at both ends, i.e., front and rear. In simple words, a double-ended queue can be referred as
a linear list of elements in which insertion and deletion of elements takes place at its two ends but
not in the middle. This is the reason why it is termed as double-ended queue or deque.

Fig. 24.1 shows the logical representation of a deque.

Fig. 24.1 Double-ended Queue

TYPES

Based on the type of restrictions imposed on insertion and deletion of elements, a double-
ended queue is categorized into two types:

1. Input-restricted deque
2. Output-restricted deque

Input-restricted Deque

It allows deletion from both the ends but restricts the insertion at only one end.

Output-restricted Deque

It allows insertion at both the ends but restricts the deletion at only one end.

OPERATIONS

As shown in Fig., insertion and deletion of elements is possible at both front and rear ends of
the queue. As a result, the following four operations are possible for a double-ended queue:

1. EnqueueFront : Insertion at front end of the queue.


2. DequeueFront : Deletion from front end of the queue.
3. EnqueueRear : Insertion at rear end of the queue.
4. DequeueRear : Deletion from rear end of the queue.
REVIEW QUESTIONS
1. Define double ended queue (deque).
2. What are the types of deque?
3. What is an input-restricted deque?
4. What is an output-restricted deque?
5. What are the operations of deque?
6. Explain the significance of double-ended queue.
7. List the differences between stack and queue data structures.

You might also like