Stacks
Stacks
top 1
top 7 7
top 5 5 5
top 2 2 2 2
push(2) push(5) push(7) push(1)
top 21
top 7 7 top 7
5 5 5 top 5
2 2 2 2 top 2
1 pop() push(21) 21 pop() 7 pop() 5 pop()
STACK IMPLEMENTATION: ARRAY
top 1
2 5 7 1
7
5 0 1 2 3 4
2 top = 3
STACK USING AN ARRAY
int pop()
{
return A[current--];
}
void push(int x)
{
A[++current] = x;
}
STACK OPERATIONS WITH ARRAY
int top()
{
return A[current];
}
int IsEmpty()
{
return ( current == -1 );
}
int IsFull()
{
return ( current == size-1);
}
• A quick examination shows that all five operations take
constant time.
PUSH
• PUSH(STACK,TOP,MAXSTK,ITEM)
• This procedure push an ITEM onto a stack
• 1.[Stack already filled?]
• If TOP=MAXSTK then Print Over Flow and Return.
2. Set TOP=TOP+1
3.Set STACK[TOP]=ITEM
4. Return.
POP
• POP(STACK,TOP,ITEM)
• This procedure delete the top element of STACK
and assign it to the variable ITEM.
• 1.[Stack has an item to be removed?]
• If (TOP=0, then print UNDERFLOW and return.
2. Set ITEM=STACK[TOP] [Assign top element to ITEM]
3. Set TOP=TOP-1
4. Return.
USE OF STACK
• Example of use: prefix, infix, postfix expressions.
• Consider the expression A+B: we think of applying the
operator “+” to the operands A and B.
• “+” is termed a binary operator: it takes two operands.
• Writing the sum as A+B is called the infix form of the
expression.
PREFIX, INFIX, POSTFIX
+ A B prefix
A B + postfix
• Conversion to postfix
• Conversion to postfix
• Conversion to postfix
• Conversion to postfix
• Conversion to postfix
(A + B ) * C infix form
PREFIX, INFIX, POSTFIX
• Conversion to postfix
(A + B ) * C infix form
(AB+)*C convert addition
PREFIX, INFIX, POSTFIX
• Conversion to postfix
(A + B ) * C infix form
(AB+)*C convert addition
(AB+)C* convert multiplication
PREFIX, INFIX, POSTFIX
• Conversion to postfix
(A + B ) * C infix form
(AB+)*C convert addition
(AB+)C* convert multiplication
AB+C* postfix form
PRECEDENCE OF OPERATORS
A B C means A ( B C )
INFIX TO POSTFIX
Infix Postfix
A+B AB+
12 + 60 – 23 12 60 + 23 –
(A + B)*(C – D ) AB+CD–*
A B * C – D + E/F A B C*D – E F/+
INFIX TO 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
• 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