0% found this document useful (0 votes)
25 views

In The Name of Allah The Most Beneficent The Most Merciful: Subject: Data Structures & Algorithms

The document discusses evaluating expressions in postfix notation using a stack. It provides an example of evaluating the postfix expression "6 2 3 + - 3 8 2 / + * 2  3 +" step-by-step. Each operand is pushed onto the stack, and when an operator is encountered, the top two elements are popped off the stack, the operation is performed, and the result is pushed back onto the stack. The final result is the single remaining element left on the stack after all operations are completed.

Uploaded by

Abdullah Jutt
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
25 views

In The Name of Allah The Most Beneficent The Most Merciful: Subject: Data Structures & Algorithms

The document discusses evaluating expressions in postfix notation using a stack. It provides an example of evaluating the postfix expression "6 2 3 + - 3 8 2 / + * 2  3 +" step-by-step. Each operand is pushed onto the stack, and when an operator is encountered, the top two elements are popped off the stack, the operation is performed, and the result is pushed back onto the stack. The final result is the single remaining element left on the stack after all operations are completed.

Uploaded by

Abdullah Jutt
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 47

In the Name of Allah the Most

Beneficent the Most Merciful

Subject : Data Structures & Algorithms

Lecture : 12

Monday, January 18, 20 1


21
Evaluating Postfix
Stack s;
while( not end of input ) {
e = get next element of input
if( e is an operand )
s.push( e );
else {
op2 = s.pop();
op1 = s.pop();
value = result of applying operator ‘e’ to op1 and op2;
s.push( value );
}
}
finalresult = s.pop();
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
2 6,2
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
2 6,2
3 6,2,3
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
2 6,2
3 6,2,3
+ 2 3 5 6,5
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
2 6,2
3 6,2,3
+ 2 3 5 6,5
- 6 5 1 1
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
2 6,2
3 6,2,3
+ 2 3 5 6,5
- 6 5 1 1
3 6 5 1 1,3
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
2 6,2
3 6,2,3
+ 2 3 5 6,5
- 6 5 1 1
3 6 5 1 1,3
8 6 5 1 1,3,8
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
2 6,2
3 6,2,3
+ 2 3 5 6,5
- 6 5 1 1
3 6 5 1 1,3
8 6 5 1 1,3,8
2 6 5 1 1,3,8,2
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
2 6,2
3 6,2,3
+ 2 3 5 6,5
- 6 5 1 1
3 6 5 1 1,3
8 6 5 1 1,3,8
2 6 5 1 1,3,8,2
/ 8 2 4 1,3,4
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
2 6,2
3 6,2,3
+ 2 3 5 6,5
- 6 5 1 1
3 6 5 1 1,3
8 6 5 1 1,3,8
2 6 5 1 1,3,8,2
/ 8 2 4 1,3,4
+ 3 4 7 1,7
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
2 6,2
3 6,2,3
+ 2 3 5 6,5
- 6 5 1 1
3 6 5 1 1,3
8 6 5 1 1,3,8
2 6 5 1 1,3,8,2
/ 8 2 4 1,3,4
+ 3 4 7 1,7
* 1 7 7 7
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
2 6,2
3 6,2,3
+ 2 3 5 6,5
- 6 5 1 1
3 6 5 1 1,3
8 6 5 1 1,3,8
2 6 5 1 1,3,8,2
/ 8 2 4 1,3,4
+ 3 4 7 1,7
* 1 7 7 7
2 1 7 7 7,2
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
2 6,2
3 6,2,3
+ 2 3 5 6,5
- 6 5 1 1
3 6 5 1 1,3
8 6 5 1 1,3,8
2 6 5 1 1,3,8,2
/ 8 2 4 1,3,4
+ 3 4 7 1,7
* 1 7 7 7
2 1 7 7 7,2
 7 2 49 49
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
2 6,2
3 6,2,3
+ 2 3 5 6,5
- 6 5 1 1
3 6 5 1 1,3
8 6 5 1 1,3,8
2 6 5 1 1,3,8,2
/ 8 2 4 1,3,4
+ 3 4 7 1,7
* 1 7 7 7
2 1 7 7 7,2
 7 2 49 49
3 7 2 49 49,3
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
2 6,2
3 6,2,3
+ 2 3 5 6,5
- 6 5 1 1
3 6 5 1 1,3
8 6 5 1 1,3,8
2 6 5 1 1,3,8,2
/ 8 2 4 1,3,4
+ 3 4 7 1,7
* 1 7 7 7
2 1 7 7 7,2
 7 2 49 49
3 7 2 49 49,3
+ 49 3 52 52
Evaluating Postfix
Evaluate 6 2 3 + - 3 8 2 / + * 2  3 +
Input op1 op2 value stack
6 6
2 6,2
3 6,2,3
+ 2 3 5 6,5
- 6 5 1 1
3 6 5 1 1,3
8 6 5 1 1,3,8
2 6 5 1 1,3,8,2
/ 8 2 4 1,3,4
+ 3 4 7 1,7
* 1 7 7 7
2 1 7 7 7,2
 7 2 49 49
3 7 2 49 49,3
+ 49 3 52 52
Converting Infix to Postfix

• Consider the infix expressions ‘A+B*C’ and ‘


(A+B)*C’.
• The postfix versions are ‘ABC*+’ and
‘AB+C*’.
• The order of operands in postfix is the same
as the infix.
• In scanning from left to right, the operand ‘A’
can be inserted into postfix expression.
Converting Infix to Postfix
• The ‘+’ cannot be inserted until its second
operand has been scanned and inserted.
• The ‘+’ has to be stored away until its proper
position is found.
• When ‘B’ is seen, it is immediately inserted
into the postfix expression.
• Can the ‘+’ be inserted now? In the case of
‘A+B*C’ cannot because * has precedence.
Converting Infix to Postfix
• In case of ‘(A+B)*C’, the closing
parenthesis indicates that ‘+’ must be
performed first.
• Assume the existence of a function
‘prcd(op1,op2)’ where op1 and op2 are
two operators.
• Prcd(op1,op2) returns TRUE if op1 has
precedence over op2, FASLE otherwise.
Converting Infix to Postfix
• prcd(‘*’,’+’) is TRUE
• prcd(‘+’,’+’) is TRUE
• prcd(‘+’,’*’) is FALSE
• Here is the algorithm that converts infix
expression to its postfix form.
• The infix expression is without
parenthesis.
Converting Infix to Postfix
1. Stack s;
2. While( not end of input ) {
3. c = next input character;
4. if( c is an operand )
5. add c to postfix string;
6. else {
7. while( !s.empty() && prcd(s.top(),c) ){
8. op = s.pop();
9. add op to the postfix string;
10. }
11. s.push( c );
12. }
13. while( !s.empty() ) {
14. op = s.pop();
15. add op to postfix string;
16. }
Converting Infix to Postfix
• Example: A + B * C
symb postfix stack
A A
Converting Infix to Postfix
• Example: A + B * C
symb postfix stack
A A
+ A +
Converting Infix to Postfix
• Example: A + B * C
symb postfix stack
A A
+ A +
B AB +
Converting Infix to Postfix
• Example: A + B * C
symb postfix stack
A A
+ A +
B AB +
* AB +*
Converting Infix to Postfix
• Example: A + B * C
symb postfix stack
A A
+ A +
B AB +
* AB +*
C ABC +*
Converting Infix to Postfix
• Example: A + B * C
symb postfix stack
A A
+ A +
B AB +
* AB +*
C ABC +*
ABC * +
Converting Infix to Postfix
• Example: A + B * C
symb postfix stack
A A
+ A +
B AB +
* AB +*
C ABC +*
ABC * +
ABC * +
Converting Infix to Postfix
• Handling parenthesis
• When an open parenthesis ‘(‘ is read, it
must be pushed on the stack.
• This can be done by setting prcd(op,‘(‘ ) to
be FALSE.
• Also, prcd( ‘(‘,op ) == FALSE which
ensures that an operator after ‘(‘ is pushed
on the stack.
Converting Infix to Postfix
• When a ‘)’ is read, all operators up to the
first ‘(‘ must be popped and placed in the
postfix string.
• To do this, prcd( op,’)’ ) == TRUE.
• Both the ‘(‘ and the ‘)’ must be discarded:
prcd( ‘(‘,’)’ ) == FALSE.
• Need to change line 11 of the algorithm.
Converting Infix to Postfix
if( s.empty() || symb != ‘)’ )
s.push( c );
else
s.pop(); // discard the ‘(‘

prcd( ‘(‘, op ) = FALSE for any operator


prcd( op, ‘)’ ) = FALSE for any operator
other than ‘)’
prcd( op, ‘)’ ) = TRUE for any operator
other than ‘(‘
prcd( ‘)’, op ) = error for any operator.
Converting Infix to Postfix
• Example: (A + B) * C
symb postfix stack
( (
AA (
+A (+
B AB (+
) AB +
* AB + *
C AB + C *
AB + C *
Function Call Stack
• Stacks play a key role in implementation of
function calls in programming languages.

• In C++, for example, the “call stack” is used to


pass function arguments and receive return
values.

• The call stack is also used for “local variables”


Call Stack
• In GCC, a popular C/C++ compiler on Intel
platform, stack entries are:

n*4(%esp) last argument


……….
8(%esp) second argument
4(%esp) first argument
(%esp) return address top
Call Stack
Example: consider the function:

int i_avg (int a, int b)


{
return (a + b) / 2;
}

# Stack layout on entry:


#
# 8(%esp) b
# 4(%esp) a
# (%esp) return address
Call Stack
Example: consider the function:

int i_avg (int a, int b)


{
return (a + b) / 2;
}

.globl _i_avg
_i_avg:
movl 4(%esp), %eax
addl 8(%esp), %eax # Add the args
sarl $1, %eax # Divide by 2
ret # Return value is in %eax
Memory Organization
Process 1
• When a program (browser)
(.exe) is run, it is Process 3
loaded in memory. It (word)
becomes a process.
Process 4
• The process is given (excel)
a block of memory. Process 2
• [Control-Alt-DEL] (dev-c++)

Windows OS
Task Manager
Memory Organization
Process 1
(browser)
Code
Process 3
(word) Static data

Process 4 Stack
(excel)

Process 2
(dev-c++)

Windows OS Heap
Stack Layout during a call
 Here is stack layout when function F calls
function G:
Parameters(F) Parameters(F) Parameters(F)
Local variables(F) Local variables(F) Local variables(F)

Return address(F) Return address(F) Return address(F)


sp
Parameters(G) Parameters(G)
sp
Local variables(G)

Return address(G)
sp
At point of call During execution of G After call
Stack Applications…

• Finding Factorial
• Tower of Hanoi
• Stack use in compliers
– Translate infix expressions into some form of
postfix notation
– Translate postfix expression into machine code

AL 43
Tower of Hanoi
• The Tower of Hanoi (also called the Tower of Brahma is a 
mathematical game or puzzle. It consists of three rods, and a number of
disks of different sizes which can slide onto any rod. The puzzle starts
with the disks in a neat stack in ascending order of size on one rod, the
smallest at the top, thus making a conical shape.
• The objective of the puzzle is to move the entire stack to another rod,
obeying the following simple rules:
i. Only one disk can be moved at a time.
ii. Each move consists of taking the upper disk from one of the stacks and
placing it on top of another stack i.e. a disk can only be moved if it is the
uppermost disk on a stack.
iii. No disk may be placed on top of a smaller disk.
• With three disks, the puzzle can be solved in seven moves. The minimum
number of moves required to solve a Tower of Hanoi puzzle is 2 n - 1,
AL 44
where n is the number of disks
Tower of Hanoi

AL 45
Underflow & Overflow
• When stack comes to its limit and yet another operation
tries to PUSH data onto the stack then a 'stack overflow'
occurs. When this happens it often causes the program to
crash. It is up to the software programmer to ensure that the
stack does not overflow.

• If the stack is empty and yet a POP operation is attempted,


this is called an 'stack underflow' and can cause a program
to crash. The software programmer should check that the
stack is not empty before attempting a POP operation.

AL 46
Summary
• Stack
– Last In First Out (LIFO) data structure
– Implemented as array or linked list
– Arrays: limited number of elements
– Linked lists: allow dynamic element addition
• Stack use in compliers
– Translate infix expressions into some form of
postfix notation
– Translate postfix expression into machine code

Data Structures Using C++ 2E


47

You might also like