Week 3 - Stack
Week 3 - Stack
• The plate which is at the top is the first one to be removed, i.e. the plate
which has been placed at the bottommost position remains in the stack for
the longest period of time.
STACK 9/11/2023 3
Main stack operations
A stack is used for the following two primary operations, push(Insertion) and pop(Deletion) −
• push() − Pushing / Inserting an element on the stack.
• pop() − Removing / Deleting an element from the stack.
Stack restriction - Elements can be inserted or deleted only from one end i.e. top of the stack.
Main stack operations
PUSH
Process of putting a new data element onto stack is known as a Push.
Pushing (storing) an element onto the top of the stack (insert an item).
Stack
STACK 9/11/2023 5
Push operation involves a series of steps −
Step 1 − Checks if the stack is full.
Step 2 − If the stack is full, produces an error and exit.
Step 3 − If the stack is not full, increments top to point next empty space.
Step 4 − Adds data element to the stack location, where top is pointing.
Step 5 − Returns success.
Algorithm C program
begin procedure push: stack, data void push(int data)
if stack is full { if(isFull())
return null {printf("Overflow");}
endif else
top ← top + 1 {top = top + 1;
stack[top] ← data stack[top] = data;}
end procedure }
STACK 9/11/2023 6
Main stack operations
POP
Accessing the content while removing it from the stack, is known as a Pop.
Popping (Removing/accessing) an element off the top of the stack (delete
an item).
Stack
STACK 9/11/2023 7
Pop operation involves the following steps −
Step 1 − Checks if the stack is empty.
Step 2 − If the stack is empty, produces an error and exit.
Step 3 − If the stack is not empty, accesses the data element at which top is pointing.
Step 4 − Decreases the value of top by 1.
Step 5 − Returns success.
Algorithm C program
int pop(int data)
begin procedure pop: stack
{ if(!isempty())
if stack is empty { data = stack[top];
return null top = top - 1;
endif return data;}
data ← stack[top] else
top ← top - 1 { printf("Could not retrieve
data,Stack is empty.\n");
return data
}
end procedure }
STACK 9/11/2023 8
Let n be the number of elements in the stack.
The complexities of stack operations are:-
Representation can be given as:
STACK 9/11/2023 9
Peek
get the top data element of the stack, without removing it.
isFull
check if stack is full.
isEmpty
check if stack is empty.
STACK 9/11/2023 10
To get the top data element of the stack, without removing it.
Algorithm C program
begin procedure peek int peek()
return stack[top] { return stack[top];
end procedure }
STACK 9/11/2023 11
To check if stack is full
Algorithm C program
begin procedure isfull bool isfull()
STACK 9/11/2023 12
To check if stack is empty
Algorithm C program
STACK 9/11/2023 13
Following are some of the applications in which stacks play an important role:-
Direct applications
Balancing of symbols
Infix-to-postfix conversion
Evaluation of postfix expression
Implementing function calls (including recursion)
Finding of spans (finding spans in stock markets, refer
to Problems section)
Page-visited history in a Web browser [Back Buttons]
Undo sequence in a text editor
Matching Tags in HTMLand XML
STACK 9/11/2023 14
Indirect applications
Auxiliary data structure for other algorithms
(Example: Tree traversal algorithms)
Component of other data structures (Example:
Simulating queues)
STACK 9/11/2023 15
Algorithm to reverse a string
1. Given the string and a stack
2. While there is not end of string, do the following:-
3. Read a character form the string
4. Push it on the stack
5. End while
6. Re-initialize string position
7. While stack is not Empty, do the following:-
8. Pop a character from the stack
9. Insert the character popped into next position in string
10.End While
STACK 9/11/2023 16
void main( )
{
char str[ ] =”SPOT”;
cout<<” Original String is “<<str;
reverse(str);
cout<<” Reversed String is “<<str;
getch();
}
STACK
9/11/2023 17
Expression
<operand><operator><operand>
Operands are basic objects on which operation is performed.
Operators are used to indicate the operation performed on operands.
• 2+3
• A-b Common expressions
• (P*2)
Expression Notations
STACK 9/11/2023 18
• An expression in which the operator is in between its two operands.
A+B
<operand><operator><operand>
• (2+3) *
• (P+Q)*(R+S)
STACK 9/11/2023 19
Order of precedence BODMAS
1. (){}[]
2. ^ RL
3. */ LR
4. +- LR
STACK 9/11/2023 20
In prefix notation the operator preceds the two operands.
i.e. the operator is written before the operands.
<operator><operand><operand>
Infix prefix
2+3 +23
p-q -pq
A*B+C +*ABC
STACK 9/11/2023 21
In postfix notation the operators are written after the operands
so it is called the postfix notation (post means after).
<operand><operand> <operator>
STACK 9/11/2023 22
1. Scan the input string (infix notation) from left to right.
2. If the next symbol scanned is an operand, it may be
immediately appended to the postfix string.
3. If the next symbol is an operator,
i. Pop and append to the postfix string every operator on the
stack that
a. is above the most recently scanned left parenthesis
b. has precedence higher than or is a operator of equal
precedence to that of the new operator.
ii. Push the new operator onto the stack.
STACK 9/11/2023
contd… 23
4. When a left parenthesis is seen, it must be pushed onto the
stack.
5. When a right parenthesis is seen, all operators down to the
most recently scanned left parenthesis must be popped
and appended to the postfix string. Furthermore, this pair
of parentheses must be discarded.
6. When the infix string is completely scanned, the stack may
still contain some operators.
7. All remaining operators should be popped and appended
to the postfix string.
STACK 9/11/2023 24
STACK 9/11/2023 25
STACK 9/11/2023 26
1. While reading the expression from Algorithm
left to right, if the element is an 1) Add ) to postfix expression.
operand, Push it into the stack. 2) Read postfix expression Left to Right until
2. If the element is an operator, Pop “)” encountered
the two operands from the stack 3) If operand is encountered, push it onto Stack
and then evaluate it. [End If]
3. Push back the result of the 4) If an operator is encountered, Pop two elements
i) A -> Top element
evaluation.
ii) B-> Next to Top element
4. Repeat it till the end of the iii) Evaluate B operator A
expression. iv) Push B operator A onto Stack
5) Set result = pop
6) END
STACK 9/11/2023 27
Expression: 456*+
STACK 9/11/2023 28
The only change from postfix conversion is that the operator is placed before
operand.
A+B +AB
A+B-C +AB-C+-ABC
(A+B)*(C-D) (+AB)*(-CD)*+AB-CD
A^B*C-D+E/F/(G+H) ?
((A+B)*C-(D-E))^(F+G) ?
A-B/(C*D^E) ?
STACK 9/11/2023 29
•Reverse the infix expression given in the problem.
•Scan the expression from left to right.
•Whenever the operands arrive, print them.
•If operator arrives and stack is empty, then Push the operator into the stack.
•If operator has higher or same precedence than TOP of stack, Push operator into
the stack.
•If operator has lower precedence than TOP of stack, Pop and print Top of stack
•When end of expression is reached, Pop and print all operators from TOP of stack.
•If operator is ')', then Push it into the stack.
•If operator is '(', then Pop all operators from stack till it finds ‘)’ in the stack.
•If the top of the stack is ')', Push the operator into the stack.
•At the end, Reverse the output.
STACK 9/11/2023 30
Step 1. Push “)” onto STACK, and add “(“ to end of the A
Step 2. Scan A from right to left and repeat step 3 to 6 for each
element of A until the STACK is empty
Step 3. If an operand is encountered, add it to B
Step 4. If a right parenthesis is encountered, push it onto STACK
Step 5. If an operator is encountered then:
a. Repeatedly pop from STACK and add to B each operator
(on the top of STACK) which has higher precedence than
the operator.
b. Add operator to STACK
Step 6. If left parenthesis is encountered then
a. Repeatedly pop from STACK and add to B (each operator
on top of stack until a right parenthesis is encountered)
b. Remove the left & right parenthesis
Step 7. Exit
STACK 9/11/2023 31
Input expression Stack Prefix expression
• K + L - M * N + (O^P) * W/U/V * T + Q
Q Q
+ + Q
• To convert the expression from infix to T + QT
STACK 9/11/2023 32
Linked list implementation of stack
• Instead of using array, linked list can also be used to implement stack.
• Linked list allocates the memory dynamically.
• Time complexity in both the scenario is same for all the operations i.e. push, pop and peek.
• In linked list implementation of stack, the nodes are maintained non-contiguously in the memory.
• Each node contains a pointer to its immediate successor node in the stack.
• Stack is said to be overflow if the space left in the memory heap is not enough to create a node.
• The top most node in the stack always contains null in its address field.
STACK 9/11/2023 33
Adding a node to the stack (Push operation)
Pushing an element to a stack in linked list implementation is different from that of an array implementation.
STACK 9/11/2023 34
Push operation
STACK 9/11/2023 35
Deleting a node from the stack (POP operation)
Deleting a node from the top of stack is referred to as pop operation.
Deleting a node from linked list implementation of stack is different from that in array implementation.
STACK 9/11/2023 36
POP operation
STACK 9/11/2023 37
Display the nodes (Traversing)
Displaying all the nodes of a stack needs traversing all the nodes of the linked
list organized in the form of stack.
STACK 9/11/2023 38
C implementation void display()
{ int i;
struct node *ptr;
ptr=head;
if(ptr == NULL)
{ printf("Stack is empty\n"); }
else
{ printf("Printing Stack elements \n");
while(ptr!=NULL)
{ printf("%d\n",ptr->val);
ptr = ptr->next;
} }
} STACK 9/11/2023 39
THANKYOU
STACK 9/11/2023 40