1
Data Structures
Lecture 7
Stack
1
2
Objectives Overview
 Stacks
 Concept
 Stack Operations
 Push and Pop
 Stack Implementation
 Static Array Based
 Dynamic Linked List
 Stack Applications
 Balanced Symbol Checking
 Prefix, Infix and Postfix
3
Stacks
 Real Life Examples
 Shipment in a Cargo
 Plates on a tray
 Stack of Coins
 Stack of Drawers
 Shunting of Trains in
Railway Yard
 Follows the Last-In First-
Out (LIFO) strategy
3
4
Stack Examples
5
Stack
 An ordered collection of homogeneous data
elements where the insertions and deletions
take place at one end only called Top
 New elements are added
or pushed onto the top of
the stack
 The first element to be
removed or popped is
taken from the top - the
last one in
6
Stack Operations
Insertion
Deletion
Bottom Top
7
Stack Operations
 A stack is generally implemented with only two
principle operations
 Push adds an item to a stack
 Pop extracts the most recently pushed item from the
stack
 Other methods such as
 Top returns the item at the top without removing it
 Isempty() determines whether the stack has anything in
it or not.
8
Common Stack Operations
1. TOP(S): Return the element at the top of stack S.
2. POP(S): Remove the top element of the stack.
3. PUSH(S): Insert the element x at the top of the
stack.
4. ISEMPTY(S): Return true if S is an empty stack;
return false otherwise.
9
Stack Operations
10
Push and Pop Trace
11
Stack – Array Implementation
 First Implementation
 Elements are stored in contiguous cells of an array.
 New elements can be inserted to the top of the list
Last Element
Second Element
First Element
List
Empty
maxlength
top
12
Push– Array Implementation
4
3
2
1
0
Empty stack
StackSize = 5
top = -1
7
0
1
2
3
4
top
Push 7
7
0
8
1
2
3
4
top
Push 8 Push 9
7
0
8
1
9
2
3
4
top
Push 4
7
0
8
1
9
2
4
3
4
top
Push 5
7
0
8
1
9
2
4
3
5
4
top
top = StackSize – 1,
Stack is full,
We can’t push more elements
13
Push – Array Implementation
push(Stack[],element)
{
if (top == StackSize – 1)
cout<<“stack is full”;
else
Stack[++top] = element;
}
14
Pop – Array Implementation
4
3
2
1
0
Empty stack top = -1
We can’t pop more
elements
7
0
1
2
3
4
top
Pop
7
0
8
1
2
3
4
top
7
0
8
1
9
2
3
4
top
7
0
8
1
9
2
4
3
4
top
7
0
8
1
9
2
4
3
5
4
top
top = StackSize – 1,
Stack is full,
We can’t push more elements.
Pop
Pop Pop
Pop
15
Pop – Array Implementation
pop( Stack[])
{
if (top == –1)
cout<<“stack is empty”;
else
return Stack[top--];
}
16
Other Stack Operations
//returns the top element of stack without removing it
int top (Stack[]) {
if (top == –1)
cout<<“stack is empty”;
else
return Stack[top];}
int isEmpty() { //checks stack is empty or not
if (top == –1)
return 1;
else
return 0; }
17
Select position 0 as top of the stack
 Model with an array
 Let position 0 be top of stack
 Problem consider pushing and popping
 Requires much shifting
18
Stack – Array Implementation
 Since, in a stack the insertion and deletion take
place only at the top, so…
 A better Implementation:
 Anchor the bottom of the stack at the bottom of
the array
 Let the stack grow towards the top of the array
 Top indicates the current position of the first
stack element
19
Stack – Array Implementation
 A better Implementation:
First Element
Last Element
maxlength
top
1
2
.
.
20
Select position 0 as bottom of the Stack
 A better approach is to let position 0 be the bottom of the
stack
 Thus our design will include
 An array to hold the stack elements
 An integer to indicate the top of the stack
21
Stack – Linked Representation
 PUSH and POP operate only on the header
cell and the first cell on the list
struct Node{
int data;
Node* next;
} *top;
top = NULL;
7 8 9
Top
22
Push operation - Algorithm
void push (int item) {
Node *newNode;
// Insert at Front of the list
newNode->data = item;
newNode->next = top;
top = newNode;
}
23
Push Operation - Trace
24
Pop Operation - Algorithm
int pop () {
Node *temp; int val;
if (top == NULL)
return -1;
else { // delete the first node of the list
temp = top;
top = top->next;
val = temp->data;
delete temp;
return val;
}
}
25
Pop Operation - Trace
Outline
Outline
1. Define struct
1.1 Function
definitions
1.2 Initialize variables
2. Input choice
1 /* Fig. 12.8: fig12_08.c
2 dynamic stack program */
3 #include <stdio.h>
4 #include <stdlib.h>
5
6 struct stackNode { /* self-referential structure */
7 int data;
8 struct stackNode *nextPtr;
9 };
10
11 typedef struct stackNode StackNode;
12 typedef StackNode *StackNodePtr;
13
14 void push( StackNodePtr *, int );
15 int pop( StackNodePtr * );
16 int isEmpty( StackNodePtr );
17 void printStack( StackNodePtr );
18 void instructions( void );
19
20 int main()
21 {
22 StackNodePtr stackPtr = NULL; /* points to stack top */
23 int choice, value;
24
25 instructions();
26 printf( "? " );
27 scanf( "%d", &choice );
28
Outline
Outline
2.1 switch statement
29 while ( choice != 3 ) {
30
31 switch ( choice ) {
32 case 1: /* push value onto stack */
33 printf( "Enter an integer: " );
34 scanf( "%d", &value );
35 push( &stackPtr, value );
36 printStack( stackPtr );
37 break;
38 case 2: /* pop value off stack */
39 if ( !isEmpty( stackPtr ) )
40 printf( "The popped value is %d.n",
41 pop( &stackPtr ) );
42
43 printStack( stackPtr );
44 break;
45 default:
46 printf( "Invalid choice.nn" );
47 instructions();
48 break;
49 }
50
51 printf( "? " );
52 scanf( "%d", &choice );
53 }
54
55 printf( "End of run.n" );
56 return 0;
57 }
58
Outline
Outline
3. Function definitions
59 /* Print the instructions */
60 void instructions( void )
61 {
62 printf( "Enter choice:n"
63 "1 to push a value on the stackn"
64 "2 to pop a value off the stackn"
65 "3 to end programn" );
66 }
67
68 /* Insert a node at the stack top */
69 void push( StackNodePtr *topPtr, int info )
70 {
71 StackNodePtr newPtr;
72
73 newPtr = malloc( sizeof( StackNode ) );
74 if ( newPtr != NULL ) {
75 newPtr->data = info;
76 newPtr->nextPtr = *topPtr;
77 *topPtr = newPtr;
78 }
79 else
80 printf( "%d not inserted. No memory available.n",
81 info );
82 }
83
Outline
Outline
3. Function definitions
84 /* Remove a node from the stack top */
85 int pop( StackNodePtr *topPtr )
86 {
87 StackNodePtr tempPtr;
88 int popValue;
89
90 tempPtr = *topPtr;
91 popValue = ( *topPtr )->data;
92 *topPtr = ( *topPtr )->nextPtr;
93 free( tempPtr );
94 return popValue;
95 }
96
97 /* Print the stack */
98 void printStack( StackNodePtr currentPtr )
99 {
100 if ( currentPtr == NULL )
101 printf( "The stack is empty.nn" );
102 else {
103 printf( "The stack is:n" );
104
105 while ( currentPtr != NULL ) {
106 printf( "%d --> ", currentPtr->data );
107 currentPtr = currentPtr->nextPtr;
108 }
109
110 printf( "NULLnn" );
111 }
112 }
113
Outline
Outline
3. Function definitions
Program Output
114/* Is the stack empty? */
115int isEmpty( StackNodePtr topPtr )
116{
117 return topPtr == NULL;
118}
Enter choice:
1 to push a value on the stack
2 to pop a value off the stack
3 to end program
? 1
Enter an integer: 5
The stack is:
5 --> NULL
? 1
Enter an integer: 6
The stack is:
6 --> 5 --> NULL
? 1
Enter an integer: 4
The stack is:
4 --> 6 --> 5 --> NULL
? 2
The popped value is 4.
The stack is:
6 --> 5 --> NULL
31
Algorithm in Practice
 list[i] = 3 * ( 44 - method( foo( list[ 2 * (i + 1) +
foo( list[i - 1] ) ) / 2 *) - list[ method(list[0])];
 Processing a file
 Tokenization: the process of scanning an input
stream. Each independent chunk is a token.
 Tokens may be made up of 1 or more
characters
32
Mathematical Calculations
What is 3 + 2 * 4? 2 * 4 + 3? 3 * 2 + 4?
The precedence of operators affects the
order of operations
A mathematical expression cannot simply be
evaluated left to right.
A challenge when evaluating a program.
Lexical analysis is the process of
interpreting a program. Involves
Tokenization
What about 1 - 2 - 4 ^ 5 * 3 * 6 / 7 ^ 2 ^ 2
33
Mathematical Expression Notation
 The way we are used to writing expressions is
known as infix notation
 Postfix expression does not require any
precedence rules
 3 2 * 1 + is postfix of 3 * 2 + 1
34
Operator Precedence and Associativity
 Order includes
Power, square
roots
 Operator
Precedence in
Java
35
Operator Precedence in C++
36
Evaluating Prefix (Polish Notation)
37
Evaluating Prefix Notation
 Algorithm
38
Prefix Notation Stack Example
39
Converting Infix to Postfix Notation
The first thing you need to do is fully parenthesize the
expression.
So, the expression (3 + 6) * (2 - 4) + 7
Becomes (((3 + 6) * (2 - 4)) + 7).
Now, move each of the operators immediately to the
right of their respective right parentheses. If you do
this, you will see that
(((3 + 6) * (2 - 4)) + 7) becomes 3 6 + 2 4 - * 7 +
40
Implementing Postfix Through Stack
 Read in one symbol at a time from the postfix expression.
 Any time you see an operand, push it onto the stack
 Any time you see a binary operator (+, -, *, /) or unary
(square root, negative sign) operator
 If the operator is binary, pop two elements off of the stack.
 If the operator is unary, pop one element off the stack.
 Evaluate those operands with that operator
 Push the result back onto the stack.
 When you're done with the entire expression, the only
thing left on the stack should be the final result
 If there are zero or more than 1 operands left on the stack, either
your program is flawed, or the expression was invalid
 The first element you pop off of the stack in an operation
should be evaluated on the right-hand side of the operator
 For multiplication and addition, order doesn't matter, but for
subtraction and division, the answer will be incorrect if the
operands are switched around. 40
41
Implementing Postfix Through Stack
41
42
Implementing Postfix Through Stack
42
43
Implementing Infix Through Stacks
 Implementing infix notation with stacks is
substantially more difficult
 3 stacks are needed :
 one for the parentheses
 one for the operands, and
 one for the operators.
 Fully parenthesize the infix expression before
attempting to evaluate it
44
Implementing Infix Through Stack
 To evaluate an expression in infix notation:
 Keep pushing elements onto their respective
stacks until a closed parenthesis is reached
 When a closed parenthesis is encountered
 Pop an operator off the operator stack
 Pop the appropriate number of operands off the
operand stack to perform the operation
 Once again, push the result back onto the
operand stack
45
Implementing Infix Through Stack
 Keep pushing elements
onto their respective
stacks until a closed
parenthesis is reached
 When a closed
parenthesis is
encountered
 Pop an operator off the
operator stack
 Pop the appropriate number
of operands off the operand
stack to perform the
operation
 Once again, push the
result back onto the
46
Application of Stacks
 Direct applications
 Page-visited history in a Web browser
 Undo sequence in a text editor
 Chain of method calls in the Java Virtual Machine
 Validate XML
 Indirect applications
 Auxiliary data structure for algorithms
 Component of other data structures

Stack.pptx

  • 1.
  • 2.
    2 Objectives Overview  Stacks Concept  Stack Operations  Push and Pop  Stack Implementation  Static Array Based  Dynamic Linked List  Stack Applications  Balanced Symbol Checking  Prefix, Infix and Postfix
  • 3.
    3 Stacks  Real LifeExamples  Shipment in a Cargo  Plates on a tray  Stack of Coins  Stack of Drawers  Shunting of Trains in Railway Yard  Follows the Last-In First- Out (LIFO) strategy 3
  • 4.
  • 5.
    5 Stack  An orderedcollection of homogeneous data elements where the insertions and deletions take place at one end only called Top  New elements are added or pushed onto the top of the stack  The first element to be removed or popped is taken from the top - the last one in
  • 6.
  • 7.
    7 Stack Operations  Astack is generally implemented with only two principle operations  Push adds an item to a stack  Pop extracts the most recently pushed item from the stack  Other methods such as  Top returns the item at the top without removing it  Isempty() determines whether the stack has anything in it or not.
  • 8.
    8 Common Stack Operations 1.TOP(S): Return the element at the top of stack S. 2. POP(S): Remove the top element of the stack. 3. PUSH(S): Insert the element x at the top of the stack. 4. ISEMPTY(S): Return true if S is an empty stack; return false otherwise.
  • 9.
  • 10.
  • 11.
    11 Stack – ArrayImplementation  First Implementation  Elements are stored in contiguous cells of an array.  New elements can be inserted to the top of the list Last Element Second Element First Element List Empty maxlength top
  • 12.
    12 Push– Array Implementation 4 3 2 1 0 Emptystack StackSize = 5 top = -1 7 0 1 2 3 4 top Push 7 7 0 8 1 2 3 4 top Push 8 Push 9 7 0 8 1 9 2 3 4 top Push 4 7 0 8 1 9 2 4 3 4 top Push 5 7 0 8 1 9 2 4 3 5 4 top top = StackSize – 1, Stack is full, We can’t push more elements
  • 13.
    13 Push – ArrayImplementation push(Stack[],element) { if (top == StackSize – 1) cout<<“stack is full”; else Stack[++top] = element; }
  • 14.
    14 Pop – ArrayImplementation 4 3 2 1 0 Empty stack top = -1 We can’t pop more elements 7 0 1 2 3 4 top Pop 7 0 8 1 2 3 4 top 7 0 8 1 9 2 3 4 top 7 0 8 1 9 2 4 3 4 top 7 0 8 1 9 2 4 3 5 4 top top = StackSize – 1, Stack is full, We can’t push more elements. Pop Pop Pop Pop
  • 15.
    15 Pop – ArrayImplementation pop( Stack[]) { if (top == –1) cout<<“stack is empty”; else return Stack[top--]; }
  • 16.
    16 Other Stack Operations //returnsthe top element of stack without removing it int top (Stack[]) { if (top == –1) cout<<“stack is empty”; else return Stack[top];} int isEmpty() { //checks stack is empty or not if (top == –1) return 1; else return 0; }
  • 17.
    17 Select position 0as top of the stack  Model with an array  Let position 0 be top of stack  Problem consider pushing and popping  Requires much shifting
  • 18.
    18 Stack – ArrayImplementation  Since, in a stack the insertion and deletion take place only at the top, so…  A better Implementation:  Anchor the bottom of the stack at the bottom of the array  Let the stack grow towards the top of the array  Top indicates the current position of the first stack element
  • 19.
    19 Stack – ArrayImplementation  A better Implementation: First Element Last Element maxlength top 1 2 . .
  • 20.
    20 Select position 0as bottom of the Stack  A better approach is to let position 0 be the bottom of the stack  Thus our design will include  An array to hold the stack elements  An integer to indicate the top of the stack
  • 21.
    21 Stack – LinkedRepresentation  PUSH and POP operate only on the header cell and the first cell on the list struct Node{ int data; Node* next; } *top; top = NULL; 7 8 9 Top
  • 22.
    22 Push operation -Algorithm void push (int item) { Node *newNode; // Insert at Front of the list newNode->data = item; newNode->next = top; top = newNode; }
  • 23.
  • 24.
    24 Pop Operation -Algorithm int pop () { Node *temp; int val; if (top == NULL) return -1; else { // delete the first node of the list temp = top; top = top->next; val = temp->data; delete temp; return val; } }
  • 25.
  • 26.
    Outline Outline 1. Define struct 1.1Function definitions 1.2 Initialize variables 2. Input choice 1 /* Fig. 12.8: fig12_08.c 2 dynamic stack program */ 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 struct stackNode { /* self-referential structure */ 7 int data; 8 struct stackNode *nextPtr; 9 }; 10 11 typedef struct stackNode StackNode; 12 typedef StackNode *StackNodePtr; 13 14 void push( StackNodePtr *, int ); 15 int pop( StackNodePtr * ); 16 int isEmpty( StackNodePtr ); 17 void printStack( StackNodePtr ); 18 void instructions( void ); 19 20 int main() 21 { 22 StackNodePtr stackPtr = NULL; /* points to stack top */ 23 int choice, value; 24 25 instructions(); 26 printf( "? " ); 27 scanf( "%d", &choice ); 28
  • 27.
    Outline Outline 2.1 switch statement 29while ( choice != 3 ) { 30 31 switch ( choice ) { 32 case 1: /* push value onto stack */ 33 printf( "Enter an integer: " ); 34 scanf( "%d", &value ); 35 push( &stackPtr, value ); 36 printStack( stackPtr ); 37 break; 38 case 2: /* pop value off stack */ 39 if ( !isEmpty( stackPtr ) ) 40 printf( "The popped value is %d.n", 41 pop( &stackPtr ) ); 42 43 printStack( stackPtr ); 44 break; 45 default: 46 printf( "Invalid choice.nn" ); 47 instructions(); 48 break; 49 } 50 51 printf( "? " ); 52 scanf( "%d", &choice ); 53 } 54 55 printf( "End of run.n" ); 56 return 0; 57 } 58
  • 28.
    Outline Outline 3. Function definitions 59/* Print the instructions */ 60 void instructions( void ) 61 { 62 printf( "Enter choice:n" 63 "1 to push a value on the stackn" 64 "2 to pop a value off the stackn" 65 "3 to end programn" ); 66 } 67 68 /* Insert a node at the stack top */ 69 void push( StackNodePtr *topPtr, int info ) 70 { 71 StackNodePtr newPtr; 72 73 newPtr = malloc( sizeof( StackNode ) ); 74 if ( newPtr != NULL ) { 75 newPtr->data = info; 76 newPtr->nextPtr = *topPtr; 77 *topPtr = newPtr; 78 } 79 else 80 printf( "%d not inserted. No memory available.n", 81 info ); 82 } 83
  • 29.
    Outline Outline 3. Function definitions 84/* Remove a node from the stack top */ 85 int pop( StackNodePtr *topPtr ) 86 { 87 StackNodePtr tempPtr; 88 int popValue; 89 90 tempPtr = *topPtr; 91 popValue = ( *topPtr )->data; 92 *topPtr = ( *topPtr )->nextPtr; 93 free( tempPtr ); 94 return popValue; 95 } 96 97 /* Print the stack */ 98 void printStack( StackNodePtr currentPtr ) 99 { 100 if ( currentPtr == NULL ) 101 printf( "The stack is empty.nn" ); 102 else { 103 printf( "The stack is:n" ); 104 105 while ( currentPtr != NULL ) { 106 printf( "%d --> ", currentPtr->data ); 107 currentPtr = currentPtr->nextPtr; 108 } 109 110 printf( "NULLnn" ); 111 } 112 } 113
  • 30.
    Outline Outline 3. Function definitions ProgramOutput 114/* Is the stack empty? */ 115int isEmpty( StackNodePtr topPtr ) 116{ 117 return topPtr == NULL; 118} Enter choice: 1 to push a value on the stack 2 to pop a value off the stack 3 to end program ? 1 Enter an integer: 5 The stack is: 5 --> NULL ? 1 Enter an integer: 6 The stack is: 6 --> 5 --> NULL ? 1 Enter an integer: 4 The stack is: 4 --> 6 --> 5 --> NULL ? 2 The popped value is 4. The stack is: 6 --> 5 --> NULL
  • 31.
    31 Algorithm in Practice list[i] = 3 * ( 44 - method( foo( list[ 2 * (i + 1) + foo( list[i - 1] ) ) / 2 *) - list[ method(list[0])];  Processing a file  Tokenization: the process of scanning an input stream. Each independent chunk is a token.  Tokens may be made up of 1 or more characters
  • 32.
    32 Mathematical Calculations What is3 + 2 * 4? 2 * 4 + 3? 3 * 2 + 4? The precedence of operators affects the order of operations A mathematical expression cannot simply be evaluated left to right. A challenge when evaluating a program. Lexical analysis is the process of interpreting a program. Involves Tokenization What about 1 - 2 - 4 ^ 5 * 3 * 6 / 7 ^ 2 ^ 2
  • 33.
    33 Mathematical Expression Notation The way we are used to writing expressions is known as infix notation  Postfix expression does not require any precedence rules  3 2 * 1 + is postfix of 3 * 2 + 1
  • 34.
    34 Operator Precedence andAssociativity  Order includes Power, square roots  Operator Precedence in Java
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
    39 Converting Infix toPostfix Notation The first thing you need to do is fully parenthesize the expression. So, the expression (3 + 6) * (2 - 4) + 7 Becomes (((3 + 6) * (2 - 4)) + 7). Now, move each of the operators immediately to the right of their respective right parentheses. If you do this, you will see that (((3 + 6) * (2 - 4)) + 7) becomes 3 6 + 2 4 - * 7 +
  • 40.
    40 Implementing Postfix ThroughStack  Read in one symbol at a time from the postfix expression.  Any time you see an operand, push it onto the stack  Any time you see a binary operator (+, -, *, /) or unary (square root, negative sign) operator  If the operator is binary, pop two elements off of the stack.  If the operator is unary, pop one element off the stack.  Evaluate those operands with that operator  Push the result back onto the stack.  When you're done with the entire expression, the only thing left on the stack should be the final result  If there are zero or more than 1 operands left on the stack, either your program is flawed, or the expression was invalid  The first element you pop off of the stack in an operation should be evaluated on the right-hand side of the operator  For multiplication and addition, order doesn't matter, but for subtraction and division, the answer will be incorrect if the operands are switched around. 40
  • 41.
  • 42.
  • 43.
    43 Implementing Infix ThroughStacks  Implementing infix notation with stacks is substantially more difficult  3 stacks are needed :  one for the parentheses  one for the operands, and  one for the operators.  Fully parenthesize the infix expression before attempting to evaluate it
  • 44.
    44 Implementing Infix ThroughStack  To evaluate an expression in infix notation:  Keep pushing elements onto their respective stacks until a closed parenthesis is reached  When a closed parenthesis is encountered  Pop an operator off the operator stack  Pop the appropriate number of operands off the operand stack to perform the operation  Once again, push the result back onto the operand stack
  • 45.
    45 Implementing Infix ThroughStack  Keep pushing elements onto their respective stacks until a closed parenthesis is reached  When a closed parenthesis is encountered  Pop an operator off the operator stack  Pop the appropriate number of operands off the operand stack to perform the operation  Once again, push the result back onto the
  • 46.
    46 Application of Stacks Direct applications  Page-visited history in a Web browser  Undo sequence in a text editor  Chain of method calls in the Java Virtual Machine  Validate XML  Indirect applications  Auxiliary data structure for algorithms  Component of other data structures