Skip to content
geeksforgeeks
  • Tutorials
    • Python
    • Java
    • Data Structures & Algorithms
    • ML & Data Science
    • Interview Corner
    • Programming Languages
    • Web Development
    • CS Subjects
    • DevOps And Linux
    • School Learning
    • Practice Coding Problems
  • Courses
    • DSA to Development
    • Get IBM Certification
    • Newly Launched!
      • Master Django Framework
      • Become AWS Certified
    • For Working Professionals
      • Interview 101: DSA & System Design
      • Data Science Training Program
      • JAVA Backend Development (Live)
      • DevOps Engineering (LIVE)
      • Data Structures & Algorithms in Python
    • For Students
      • Placement Preparation Course
      • Data Science (Live)
      • Data Structure & Algorithm-Self Paced (C++/JAVA)
      • Master Competitive Programming (Live)
      • Full Stack Development with React & Node JS (Live)
    • Full Stack Development
    • Data Science Program
    • All Courses
  • C++
  • Standard Template Library
  • STL Vector
  • STL List
  • STL Set
  • STL Map
  • STL Stack
  • STL Queue
  • STL Priority Queue
  • STL Interview Questions
  • STL Cheatsheet
  • C++ Templates
  • C++ Functors
  • C++ Iterators
Open In App
Next Article:
Implement a stack using single queue
Next article icon

Design a stack that supports getMin() in O(1) time

Last Updated : 26 Apr, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report
Try it on GfG Practice
redirect icon

Design a Data Structure SpecialStack that supports all the stack operations like push(), pop(), peek() and an additional operation getMin() which should return minimum element from the SpecialStack. All these operations of SpecialStack must have a time complexity of O(1). 

Example: 

Input: queries = [push(2), push(3), peek(), pop(), getMin(), push(1), getMin()]
Output: [3, 2, 1]
Explanation:
push(2): Stack is [2]
push(3): Stack is [2, 3]
peek(): Top element is 3
pop(): Removes 3, stack is [2]
getMin(): Minimum element is 2
push(1): Stack is [2, 1]
getMin(): Minimum element is 1

Input: queries = [push(10), getMin(), push(5), getMin(), pop()]
Output: [10, 5]
Explanation:
push(10): Stack is [10]
getMin(): Minimum element is 10
push(5): Stack is [10, 5]
getMin(): Minimum element is 5
pop(): Removes 5, stack is [10]

Table of Content

  • Using an Auxiliary Stack - O(n) Time and O(n) Space
  • Using a Pair in Stack - O(1) Time and O(n) Space
  • Without Extra Space- O(1) Time and O(1) Space

Using an Auxiliary Stack - O(n) Time and O(n) Space

Use two stacks: one to store actual stack elements and the other as an auxiliary stack to store minimum values. The idea is to do push() and pop() operations in such a way that the top of the auxiliary stack is always the minimum. Let us see how push() and pop() operations work.

Push(int x)

  1. push x to the first stack (the stack with actual elements) 
  2. compare x with the top element of the second stack (the auxiliary stack). Let the top element be y. 
    • If x is smaller than y then push x to the auxiliary stack. 
    • If x is greater than y then push y to the auxiliary stack.

int Pop()

  1. pop the top element from the auxiliary stack. 
  2. pop the top element from the actual stack and return it. Step 1 is necessary to make sure that the auxiliary stack is also updated for future operations.

int getMin()

  1. Return the top element of the auxiliary stack.


C++
#include <iostream> #include <stack> using namespace std;  class SpecialStack {     stack<int> s;      stack<int> minStack;   public:     void push(int x) {         s.push(x);                  // If the minStack is empty or the new element is smaller than          // the top of minStack, push it onto minStack         if (minStack.empty() || x <= minStack.top()) {             minStack.push(x);         } else {                          // Otherwise, push the top element of minStack              // again to keep the minimum unchanged             minStack.push(minStack.top());         }     }      // Pop the top element from the stack     int pop() {         if (s.empty()) {             return -1;         }         // Pop from both stacks         int poppedElement = s.top();         s.pop();         minStack.pop();         return poppedElement;     }      // Return the top element of the stack without removing it     int peek() {         if (s.empty()) {             return -1;         }         return s.top();     }      // Check if the stack is empty     bool isEmpty() {         return s.empty();     }      // Get the minimum element in the stack     int getMin() {         if (minStack.empty()) {             return -1;         }         return minStack.top();     } };  int main() {     SpecialStack stack;          stack.push(18);     stack.push(19);     stack.push(29);     stack.push(15);     stack.push(16);      cout << stack.getMin() << endl;      return 0; } 
Java
import java.util.Stack;  class SpecialStack {     Stack<Integer> s = new Stack<>();     Stack<Integer> minStack = new Stack<>();      public void push(int x) {         s.push(x);         // If the minStack is empty or the new element is smaller than          // the top of minStack, push it onto minStack         if (minStack.isEmpty() || x <= minStack.peek()) {             minStack.push(x);         } else {             // Otherwise, push the top element of minStack              // again to keep the minimum unchanged             minStack.push(minStack.peek());         }     }      // Pop the top element from the stack     public int pop() {         if (s.isEmpty()) {             return -1;         }         // Pop from both stacks         int poppedElement = s.pop();         minStack.pop();         return poppedElement;     }      // Return the top element of the stack without removing it     public int peek() {         if (s.isEmpty()) {             return -1;         }         return s.peek();     }      // Check if the stack is empty     public boolean isEmpty() {         return s.isEmpty();     }      // Get the minimum element in the stack     public int getMin() {         if (minStack.isEmpty()) {             return -1;         }         return minStack.peek();     } }  public class GfG {     public static void main(String[] args) {         SpecialStack stack = new SpecialStack();                  stack.push(18);         stack.push(19);         stack.push(29);         stack.push(15);         stack.push(16);          System.out.println(stack.getMin());     } } 
Python
class specialStack:     def __init__(self):         self.s = []         self.minStack = []      def push(self, x):         self.s.append(x)         # If the minStack is empty or the new element is smaller than          # the top of minStack, push it onto minStack         if not self.minStack or x <= self.minStack[-1]:             self.minStack.append(x)         else:             # Otherwise, push the top element of minStack              # again to keep the minimum unchanged             self.minStack.append(self.minStack[-1])      # Pop the top element from the stack     def pop(self):         if not self.s:             return -1         # Pop from both stacks         poppedElement = self.s.pop()         self.minStack.pop()         return poppedElement      # Return the top element of the stack without removing it     def peek(self):         if not self.s:             return -1         return self.s[-1]      # Check if the stack is empty     def isEmpty(self):         return len(self.s) == 0      # Get the minimum element in the stack     def getMin(self):         if not self.minStack:             return -1         return self.minStack[-1]  if __name__ == '__main__':     stack = specialStack()          stack.push(18)     stack.push(19)     stack.push(29)     stack.push(15)     stack.push(16)      print(stack.getMin()) 
C#
using System; using System.Collections.Generic;  class SpecialStack {     Stack<int> s = new Stack<int>();     Stack<int> minStack = new Stack<int>();      public void Push(int x) {         s.Push(x);         // If the minStack is empty or the new element is smaller than          // the top of minStack, push it onto minStack         if (minStack.Count == 0 || x <= minStack.Peek()) {             minStack.Push(x);         } else {             // Otherwise, push the top element of minStack              // again to keep the minimum unchanged             minStack.Push(minStack.Peek());         }     }      // Pop the top element from the stack     public int Pop() {         if (s.Count == 0) {             return -1;         }         // Pop from both stacks         int poppedElement = s.Pop();         minStack.Pop();         return poppedElement;     }      // Return the top element of the stack without removing it     public int Peek() {         if (s.Count == 0) {             return -1;         }         return s.Peek();     }      // Check if the stack is empty     public bool IsEmpty() {         return s.Count == 0;     }      // Get the minimum element in the stack     public int GetMin() {         if (minStack.Count == 0) {             return -1;         }         return minStack.Peek();     } }  class GfG {     static void Main() {         SpecialStack stack = new SpecialStack();                  stack.Push(18);         stack.Push(19);         stack.Push(29);         stack.Push(15);         stack.Push(16);          Console.WriteLine(stack.GetMin());     } } 
JavaScript
class specialStack {     constructor() {         this.s = [];         this.minStack = [];     }      push(x) {         this.s.push(x);         // If the minStack is empty or the new element is smaller than          // the top of minStack, push it onto minStack         if (this.minStack.length === 0 || x <= this.minStack[this.minStack.length - 1]) {             this.minStack.push(x);         } else {             // Otherwise, push the top element of minStack              // again to keep the minimum unchanged             this.minStack.push(this.minStack[this.minStack.length - 1]);         }     }      // Pop the top element from the stack     pop() {         if (this.s.length === 0) {             return -1;         }         // Pop from both stacks         const poppedElement = this.s.pop();         this.minStack.pop();         return poppedElement;     }      // Return the top element of the stack without removing it     peek() {         if (this.s.length === 0) {             return -1;         }         return this.s[this.s.length - 1];     }      // Check if the stack is empty     isEmpty() {         return this.s.length === 0;     }      // Get the minimum element in the stack     getMin() {         if (this.minStack.length === 0) {             return -1;         }         return this.minStack[this.minStack.length - 1];     } }  const stack = new specialStack();  stack.push(18); stack.push(19); stack.push(29); stack.push(15); stack.push(16);  console.log(stack.getMin()); 

Output
15 

Time Complexity: 

  • For insert operation: O(1) (As insertion 'push' in a stack takes constant time)
  • For delete operation: O(1) (As deletion 'pop' in a stack takes constant time)
  • For 'Get Min' operation: O(1) (As we have used an auxiliary stack which has it's top as the minimum element)

Auxiliary Space: O(n)

Using a Pair in Stack - O(1) Time and O(n) Space

This approach uses a stack where each element is stored as a pair: the element itself and the minimum value up to that point. When an element is pushed, the minimum is updated. The getMin() function directly accesses the minimum value from the top of the stack in constant time, ensuring that both push(), pop(), and getMin() operations are O(1). This approach efficiently tracks the minimum value without needing to traverse the stack.

C++
// C++ program to implement a stack that supports // all operations in O(1) time and O(n) extra space.  #include <iostream> #include <stack> using namespace std;  // A user defined stack that supports getMin() in // addition to push(), pop() and peek() class SpecialStack { private:     stack<pair<int, int> > s;  public:     SpecialStack() {              }          // Add an element to the top of Stack     void push(int x) {         int newMin = s.empty() ? x : min(x, s.top().second);          // we push the pair of given element and newMin into stack         s.push({ x, newMin });     }          // Remove the top element from the Stack     void pop() {         if (!s.empty()) {             s.pop();         }     }          // Returns top element of the Stack     int peek() {         if (s.empty()) {             return -1;         }          int top = s.top().first;         return top;     }          // Finds minimum element of Stack     int getMin() {         if (s.empty()) {             return -1;         }                  int mn = s.top().second;         return mn;     } };  int main() {     SpecialStack ss;          // Function calls     ss.push(2);     ss.push(3);     cout << ss.peek() << " ";     ss.pop();     cout << ss.getMin() << " ";     ss.push(1);     cout << ss.getMin() << " "; } 
Java
// Java program to implement a stack that supports // all operations in O(1) time and O(n) extra space.  import java.util.Stack;  class SpecialStack {     private Stack<int[]> s;      public SpecialStack() {         s = new Stack<>();     }      // Add an element to the top of Stack     public void push(int x) {         int newMin = s.isEmpty() ? x : Math.min(x, s.peek()[1]);         s.push(new int[]{x, newMin});     }      // Remove the top element from the Stack     public void pop() {         if (!s.isEmpty()) {             s.pop();         }     }      // Returns top element of the Stack     public int peek() {         return s.isEmpty() ? -1 : s.peek()[0];     }      // Finds minimum element of Stack     public int getMin() {         return s.isEmpty() ? -1 : s.peek()[1];     }      public static void main(String[] args) {         SpecialStack ss = new SpecialStack();          // Function calls         ss.push(2);         ss.push(3);         System.out.print(ss.peek() + " ");         ss.pop();         System.out.print(ss.getMin() + " ");         ss.push(1);         System.out.print(ss.getMin() + " ");     } } 
Python
# Python program to implement a stack that supports # all operations in O(1) time and O(n) extra space.  class SpecialStack:     def __init__(self):         self.s = []      # Add an element to the top of Stack     def push(self, x):         newMin = x if not self.s else min(x, self.s[-1][1])         self.s.append((x, newMin))      # Remove the top element from the Stack     def pop(self):         if self.s:             self.s.pop()      # Returns top element of the Stack     def peek(self):         return -1 if not self.s else self.s[-1][0]      # Finds minimum element of Stack     def getMin(self):         return -1 if not self.s else self.s[-1][1]  if __name__ == "__main__":     ss = SpecialStack()     # Function calls     ss.push(2)     ss.push(3)     print(ss.peek(), end=" ")     ss.pop()     print(ss.getMin(), end=" ")     ss.push(1)     print(ss.getMin(), end=" ") 
C#
// C# program to implement a stack that supports // all operations in O(1) time and O(n) extra space.  using System; using System.Collections.Generic;  class SpecialStack {     private Stack<(int, int)> s;      public SpecialStack() {         s = new Stack<(int, int)>();     }      // Add an element to the top of Stack     public void Push(int x) {         int newMin = s.Count == 0 ? x : Math.Min(x, s.Peek().Item2);         s.Push((x, newMin));     }      // Remove the top element from the Stack     public void Pop() {         if (s.Count > 0) {             s.Pop();         }     }      // Returns top element of the Stack     public int Peek() {         return s.Count == 0 ? -1 : s.Peek().Item1;     }      // Finds minimum element of Stack     public int GetMin() {         return s.Count == 0 ? -1 : s.Peek().Item2;     }      public static void Main() {         SpecialStack ss = new SpecialStack();          // Function calls         ss.Push(2);         ss.Push(3);         Console.Write(ss.Peek() + " ");         ss.Pop();         Console.Write(ss.GetMin() + " ");         ss.Push(1);         Console.Write(ss.GetMin() + " ");     } } 
JavaScript
// JavaScript program to implement a stack that supports // all operations in O(1) time and O(n) extra space.  class SpecialStack {     constructor() {         this.s = [];     }      // Add an element to the top of Stack     push(x) {         let newMin = this.s.length === 0 ? x :                      Math.min(x, this.s[this.s.length - 1][1]);         this.s.push([x, newMin]);     }      // Remove the top element from the Stack     pop() {         if (this.s.length > 0) {             this.s.pop();         }     }      // Returns top element of the Stack     peek() {         return this.s.length === 0 ? -1 : this.s[this.s.length - 1][0];     }      // Finds minimum element of Stack     getMin() {         return this.s.length === 0 ? -1 : this.s[this.s.length - 1][1];     } }  // Driver Code const ss = new SpecialStack(); ss.push(2); ss.push(3); console.log(ss.peek() + " "); ss.pop(); console.log(ss.getMin() + " "); ss.push(1); console.log(ss.getMin() + " "); 

Output
-4 0 -4 -1

Without Extra Space- O(1) Time and O(1) Space

The idea is to use a variable minEle to track the minimum element in the stack. Instead of storing the actual value of minEle in the stack, we store a modified value when pushing an element smaller than minEle. This allows retrieving the previous minimum in O(1) time and space.

Operations

  1. Push(x)
    • If the stack is empty, push x and set minEle = x.
    • If x >= minEle, push x normally.
    • If x < minEle, push 2*x - minEle and update minEle = x (this encodes the previous min).
  2. Pop()
    • Remove the top element.
    • If the removed element is >= minEle, no change in minEle.
    • If the removed element is < minEle, update minEle = 2*minEle - top (decoding the previous min).
  3. Peek()
    • Returns minEle if the top is modified (encoded) or top otherwise.
  4. getMin()
    • Returns minEle, the current minimum in O(1) time.
C++
// C++ program to implement a stack that supports // all operations in O(1) time and O(1) extra space.  #include <iostream> #include <stack> using namespace std;  // A user defined stack that supports getMin() in // addition to push(), pop() and peek() class SpecialStack {   private:     stack<int> s;     int minEle;        public:     SpecialStack() {         minEle = -1;     }          // Add an element to the top of Stack     void push(int x) {         if (s.empty()) {             minEle = x;             s.push(x);         }          // If new number is less than minEle         else if (x < minEle) {             s.push(2 * x - minEle);             minEle = x;         }          else {             s.push(x);         }     }          // Remove the top element from the Stack     void pop() {         if (s.empty()) {             return ;         }                  int top = s.top();         s.pop();                  // Minimum will change, if the minimum element         // of the stack is being removed.         if (top < minEle) {             minEle = 2 * minEle - top;         }     }          // Returns top element of the Stack     int peek() {         if (s.empty()) {             return -1;         }          int top = s.top();          // If minEle > top means minEle stores value of top.         return (minEle > top) ? minEle : top;     }          // Finds minimum element of Stack     int getMin() {         if (s.empty())             return -1;          // variable minEle stores the minimum element         // in the stack.         return minEle;     } };  int main() {     SpecialStack ss;          // Function calls     ss.push(2);     ss.push(3);     cout << ss.peek() << " ";     ss.pop();     cout << ss.getMin() << " ";     ss.push(1);     cout << ss.getMin() << " "; } 
Java
// Java program to implement a stack that supports // all operations in O(1) time and O(1) extra space.  import java.util.Stack;  class SpecialStack {     private Stack<Integer> s;     private int minEle;      public SpecialStack() {         s = new Stack<>();         minEle = -1;     }      // Add an element to the top of Stack     public void push(int x) {         if (s.isEmpty()) {             minEle = x;             s.push(x);         }         // If new number is less than minEle         else if (x < minEle) {             s.push(2 * x - minEle);             minEle = x;         } else {             s.push(x);         }     }      // Remove the top element from the Stack     public void pop() {         if (s.isEmpty()) {             return;         }          int top = s.pop();          // Minimum will change, if the minimum element         // of the stack is being removed.         if (top < minEle) {             minEle = 2 * minEle - top;         }     }      // Returns top element of the Stack     public int peek() {         if (s.isEmpty()) {             return -1;         }          int top = s.peek();          // If minEle > top means minEle stores value of top.         return (minEle > top) ? minEle : top;     }      // Finds minimum element of Stack     public int getMin() {         if (s.isEmpty()) {             return -1;         }          // variable minEle stores the minimum element         // in the stack.         return minEle;     }      public static void main(String[] args) {         SpecialStack ss = new SpecialStack();          // Function calls         ss.push(2);         ss.push(3);         System.out.print(ss.peek() + " ");         ss.pop();         System.out.print(ss.getMin() + " ");         ss.push(1);         System.out.print(ss.getMin() + " ");     } } 
Python
# Python program to implement a stack that supports # all operations in O(1) time and O(1) extra space.  class SpecialStack:     def __init__(self):         self.s = []         self.minEle = -1      # Add an element to the top of Stack     def push(self, x):         if not self.s:             self.minEle = x             self.s.append(x)         # If new number is less than minEle         elif x < self.minEle:             self.s.append(2 * x - self.minEle)             self.minEle = x         else:             self.s.append(x)      # Remove the top element from the Stack     def pop(self):         if not self.s:             return          top = self.s.pop()          # Minimum will change, if the minimum element         # of the stack is being removed.         if top < self.minEle:             self.minEle = 2 * self.minEle - top      # Returns top element of Stack     def peek(self):         if not self.s:             return -1          top = self.s[-1]          # If minEle > top means minEle stores value of top.         return self.minEle if self.minEle > top else top      # Finds minimum element of Stack     def getMin(self):         if not self.s:             return -1          # variable minEle stores the minimum element         # in the stack.         return self.minEle  if __name__ == '__main__':     ss = SpecialStack()          # Function calls     ss.push(2)     ss.push(3)     print(ss.peek(), end=" ")     ss.pop()     print(ss.getMin(), end=" ")     ss.push(1)     print(ss.getMin(), end=" ")      
C#
// C# program to implement a stack that supports // all operations in O(1) time and O(1) extra space.  using System; using System.Collections.Generic;  class SpecialStack {     private Stack<int> s;     private int minEle;      public SpecialStack() {         s = new Stack<int>();         minEle = -1;     }      // Add an element to the top of Stack     public void Push(int x) {         if (s.Count == 0) {             minEle = x;             s.Push(x);         }         // If new number is less than minEle         else if (x < minEle) {             s.Push(2 * x - minEle);             minEle = x;         } else {             s.Push(x);         }     }      // Remove the top element from the Stack     public void Pop() {         if (s.Count == 0) {             return;         }          int top = s.Pop();          // Minimum will change, if the minimum element         // of the stack is being removed.         if (top < minEle) {             minEle = 2 * minEle - top;         }     }      // Returns top element of Stack     public int Peek() {         if (s.Count == 0) {             return -1;         }          int top = s.Peek();          // If minEle > top means minEle stores value of top.         return (minEle > top) ? minEle : top;     }      // Finds minimum element of Stack     public int GetMin() {         if (s.Count == 0) {             return -1;         }          // variable minEle stores the minimum element         // in the stack.         return minEle;     }      static void Main() {         SpecialStack ss = new SpecialStack();          // Function calls         ss.Push(2);         ss.Push(3);         Console.Write(ss.Peek() + " ");         ss.Pop();         Console.Write(ss.GetMin() + " ");         ss.Push(1);         Console.Write(ss.GetMin() + " ");     } } 
JavaScript
// JavaScript program to implement a stack that supports // all operations in O(1) time and O(1) extra space.  class SpecialStack {     constructor() {         this.s = [];         this.minEle = -1;     }      // Add an element to the top of Stack     push(x) {         if (this.s.length === 0) {             this.minEle = x;             this.s.push(x);         }         // If new number is less than minEle         else if (x < this.minEle) {             this.s.push(2 * x - this.minEle);             this.minEle = x;         } else {             this.s.push(x);         }     }      // Remove the top element from the Stack     pop() {         if (this.s.length === 0) {             return;         }          let top = this.s.pop();          // Minimum will change, if the minimum element         // of the stack is being removed.         if (top < this.minEle) {             this.minEle = 2 * this.minEle - top;         }     }      // Returns top element of Stack     peek() {         if (this.s.length === 0) {             return -1;         }          let top = this.s[this.s.length - 1];          // If minEle > top means minEle stores value of top.         return this.minEle > top ? this.minEle : top;     }      // Finds minimum element of Stack     getMin() {         if (this.s.length === 0) {             return -1;         }          // variable minEle stores the minimum element         // in the stack.         return this.minEle;     } }  // Driver Code let ss = new SpecialStack(); ss.push(2); ss.push(3); console.log(ss.peek(), " "); ss.pop(); console.log(ss.getMin(), " "); ss.push(1); console.log(ss.getMin(), " "); 

Output
3 2 1 

How does this approach work? 

When the element to be inserted is less than minEle, we insert "2x - minEle". The important thing to note is, that 2x - minEle will always be less than x (proved below), i.e., new minEle and while popping out this element we will see that something unusual has happened as the popped element is less than the minEle. So we will be updating minEle.

How 2*x - minEle is less than x in push()? 

x < minEle which means x - minEle < 0 

// Adding x on both sides
x - minEle + x < 0 + x 
2*x - minEle < x 
We can conclude 2*x - minEle < new minEle 

While popping out, if we find the element(y) less than the current minEle, we find the new minEle = 2*minEle - y

How previous minimum element, prevMinEle is, 2*minEle - y
in pop() is y the popped element?

 // We pushed y as 2x - prevMinEle. Here 
// prevMinEle is minEle before y was inserted

y = 2*x - prevMinEle  

// Value of minEle was made equal to x
minEle = x

new minEle = 2 * minEle - y 
                   = 2*x - (2*x - prevMinEle)
                   = prevMinEle // This is what we wanted


Next Article
Implement a stack using single queue

K

kartik
Improve
Article Tags :
  • Stack
  • DSA
  • Microsoft
  • Amazon
  • Adobe
  • Flipkart
  • Goldman Sachs
  • VMWare
  • Snapdeal
  • Paytm
  • Sapient
  • SAP Labs
  • FactSet
  • Kuliza
  • STL
  • GreyOrange
Practice Tags :
  • Adobe
  • Amazon
  • FactSet
  • Flipkart
  • Goldman Sachs
  • GreyOrange
  • Kuliza
  • Microsoft
  • Paytm
  • SAP Labs
  • Sapient
  • Snapdeal
  • VMWare
  • Stack
  • STL

Similar Reads

    Stack Data Structure
    A Stack is a linear data structure that follows a particular order in which the operations are performed. The order may be LIFO(Last In First Out) or FILO(First In Last Out). LIFO implies that the element that is inserted last, comes out first and FILO implies that the element that is inserted first
    3 min read
    What is Stack Data Structure? A Complete Tutorial
    Stack is a linear data structure that follows LIFO (Last In First Out) Principle, the last element inserted is the first to be popped out. It means both insertion and deletion operations happen at one end only. LIFO(Last In First Out) PrincipleHere are some real world examples of LIFOConsider a stac
    4 min read
    Applications, Advantages and Disadvantages of Stack
    A stack is a linear data structure in which the insertion of a new element and removal of an existing element takes place at the same end represented as the top of the stack.Stack Data StructureApplications of Stacks:Function calls: Stacks are used to keep track of the return addresses of function c
    2 min read
    Implement a stack using singly linked list
    To implement a stack using a singly linked list, we need to ensure that all operations follow the LIFO (Last In, First Out) principle. This means that the most recently added element is always the first one to be removed. In this approach, we use a singly linked list, where each node contains data a
    13 min read
    Introduction to Monotonic Stack - Data Structure and Algorithm Tutorials
    A monotonic stack is a special data structure used in algorithmic problem-solving. Monotonic Stack maintaining elements in either increasing or decreasing order. It is commonly used to efficiently solve problems such as finding the next greater or smaller element in an array etc.Monotonic StackTable
    12 min read
    Difference Between Stack and Queue Data Structures
    In computer science, data structures are fundamental concepts that are crucial for organizing and storing data efficiently. Among the various data structures, stacks and queues are two of the most basic yet essential structures used in programming and algorithm design. Despite their simplicity, they
    4 min read

    Stack implementation in different language

    Stack in C++ STL
    In C++, stack container follows LIFO (Last In First Out) order of insertion and deletion. It means that most recently inserted element is removed first and the first inserted element will be removed last. This is done by inserting and deleting elements at only one end of the stack which is generally
    5 min read
    Stack Class in Java
    The Java Collection framework provides a Stack class, which implements a Stack data structure. The class is based on the basic principle of LIFO (last-in-first-out). Besides the basic push and pop operations, the class also provides three more functions, such as empty, search, and peek. The Stack cl
    11 min read
    Stack in Python
    A stack is a linear data structure that stores items in a Last-In/First-Out (LIFO) or First-In/Last-Out (FILO) manner. In stack, a new element is added at one end and an element is removed from that end only. The insert and delete operations are often called push and pop. The functions associated wi
    8 min read
    C# Stack with Examples
    In C# a Stack is a Collection that follows the Last-In-First-Out (LIFO) principle. It is used when we need last-in, first-out access to items. In C# there are both generic and non-generic types of Stacks. The generic stack is in the System.Collections.Generic namespace, while the non-generic stack i
    6 min read
    Implementation of Stack in JavaScript
    A stack is a fundamental data structure in computer science that follows the Last In, First Out (LIFO) principle. This means that the last element added to the stack will be the first one to be removed. Stacks are widely used in various applications, such as function call management, undo mechanisms
    4 min read
    Stack in Scala
    A stack is a data structure that follows the last-in, first-out(LIFO) principle. We can add or remove element only from one end called top. Scala has both mutable and immutable versions of a stack. Syntax : import scala.collection.mutable.Stack var s = Stack[type]() // OR var s = Stack(val1, val2, v
    3 min read

    Some questions related to Stack implementation

    Design and Implement Special Stack Data Structure
    Design a Data Structure SpecialStack that supports all the stack operations like push(), pop(), isEmpty(), isFull() and an additional operation getMin() which should return minimum element from the SpecialStack. All these operations of SpecialStack must be O(1). To implement SpecialStack, you should
    1 min read
    Implement two Stacks in an Array
    Create a data structure twoStacks that represent two stacks. Implementation of twoStacks should use only one array, i.e., both stacks should use the same array for storing elements. Following functions must be supported by twoStacks.push1(int x) --> pushes x to first stack push2(int x) --> pus
    12 min read
    Implement Stack using Queues
    Implement a stack using queues. The stack should support the following operations:Push(x): Push an element onto the stack.Pop(): Pop the element from the top of the stack and return it.A Stack can be implemented using two queues. Let Stack to be implemented be 's' and queues used to implement are 'q
    15+ min read
    Implement k stacks in an array
    Given an array of size n, the task is to implement k stacks using a single array. We mainly need to perform the following type of queries on the stack.push(x, i) : This operations pushes the element x into stack i pop(i) : This operation pops the top of stack iHere i varies from 0 to k-1Naive Approa
    15+ min read
    Design a stack that supports getMin() in O(1) time
    Design a Data Structure SpecialStack that supports all the stack operations like push(), pop(), peek() and an additional operation getMin() which should return minimum element from the SpecialStack. All these operations of SpecialStack must have a time complexity of O(1). Example: Input: queries = [
    15+ min read
    Implement a stack using single queue
    We are given a queue data structure, the task is to implement a stack using a single queue.Also Read: Stack using two queuesThe idea is to keep the newly inserted element always at the front of the queue, preserving the order of previous elements by appending the new element at the back and rotating
    5 min read
    How to implement stack using priority queue or heap?
    How to Implement stack using a priority queue(using min heap)? Asked In: Microsoft, Adobe.  Solution: In the priority queue, we assign priority to the elements that are being pushed. A stack requires elements to be processed in the Last in First Out manner. The idea is to associate a count that dete
    6 min read
    Create a customized data structure which evaluates functions in O(1)
    Create a customized data structure such that it has functions :- GetLastElement(); RemoveLastElement(); AddElement() GetMin() All the functions should be of O(1) Question Source : amazon interview questions Approach : create a custom stack of type structure with two elements, (element, min_till_now)
    7 min read
    Implement Stack and Queue using Deque
    Deque also known as double ended queue, as name suggests is a special kind of queue in which insertions and deletions can be done at the last as well as at the beginning. A link-list representation of deque is such that each node points to the next node as well as the previous node. So that insertio
    15 min read

    Easy problems on Stack

    Infix to Postfix Expression
    Write a program to convert an Infix expression to Postfix form.Infix expression: The expression of the form "a operator b" (a + b) i.e., when an operator is in-between every pair of operands.Postfix expression: The expression of the form "a b operator" (ab+) i.e., When every pair of operands is foll
    9 min read
    Prefix to Infix Conversion
    Infix : An expression is called the Infix expression if the operator appears in between the operands in the expression. Simply of the form (operand1 operator operand2). Example : (A+B) * (C-D)Prefix : An expression is called the prefix expression if the operator appears in the expression before the
    6 min read
    Prefix to Postfix Conversion
    Given a Prefix expression, convert it into a Postfix expression. Conversion of Prefix expression directly to Postfix without going through the process of converting them first to Infix and then to Postfix is much better in terms of computation and better understanding the expression (Computers evalu
    6 min read
    Postfix to Prefix Conversion
    Postfix: An expression is called the postfix expression if the operator appears in the expression after the operands. Simply of the form (operand1 operand2 operator). Example : AB+CD-* (Infix : (A+B) * (C-D) )Prefix : An expression is called the prefix expression if the operator appears in the expre
    7 min read
    Postfix to Infix
    Postfix to infix conversion involves transforming expressions where operators follow their operands (postfix notation) into standard mathematical expressions with operators placed between operands (infix notation). This conversion improves readability and understanding.Infix expression: The expressi
    5 min read
    Convert Infix To Prefix Notation
    Given an infix expression consisting of operators (+, -, *, /, ^) and operands (lowercase characters), the task is to convert it to a prefix expression.Infix Expression: The expression of type a 'operator' b (a+b, where + is an operator) i.e., when the operator is between two operands.Prefix Express
    8 min read
    Valid Parentheses in an Expression
    Given a string s representing an expression containing various types of brackets: {}, (), and [], the task is to determine whether the brackets in the expression are balanced or not. A balanced expression is one where every opening bracket has a corresponding closing bracket in the correct order.Exa
    8 min read
    Arithmetic Expression Evaluation
    The stack organization is very effective in evaluating arithmetic expressions. Expressions are usually represented in what is known as Infix notation, in which each operator is written between two operands (i.e., A + B). With this notation, we must distinguish between ( A + B )*C and A + ( B * C ) b
    2 min read
    Evaluation of Postfix Expression
    Given a postfix expression, the task is to evaluate the postfix expression. A Postfix expression is of the form "a b operator" ("a b +") i.e., a pair of operands is followed by an operator.Examples:Input: arr = ["2", "3", "1", "*", "+", "9", "-"]Output: -4Explanation: If the expression is converted
    6 min read
    How to Reverse a Stack using Recursion
    Write a program to reverse a stack using recursion, without using any loop.Example: Input: elements present in stack from top to bottom 4 3 2 1Output: 1 2 3 4Input: elements present in stack from top to bottom 1 2 3Output: 3 2 1The idea of the solution is to hold all values in Function Call Stack un
    4 min read
    Reverse individual words
    Given string str, we need to print the reverse of individual words.Examples: Input: Hello WorldOutput: olleH dlroWExplanation: Each word in "Hello World" is reversed individually, preserving the original order, resulting in "olleH dlroW".Input: Geeks for GeeksOutput: skeeG rof skeeG[Expected Approac
    5 min read
    Reverse a String using Stack
    Given a string str, the task is to reverse it using stack. Example:Input: s = "GeeksQuiz"Output: ziuQskeeGInput: s = "abc"Output: cbaAlso read: Reverse a String – Complete Tutorial.As we all know, stacks work on the principle of first in, last out. After popping all the elements and placing them bac
    3 min read
    Reversing a Queue
    You are given a queue Q, and your task is to reverse the elements of the queue. You are only allowed to use the following standard queue operations:enqueue(x): Add an item x to the rear of the queue.dequeue(): Remove an item from the front of the queue.empty(): Check if the queue is empty or not.Exa
    4 min read

    Intermediate problems on Stack

    How to create mergeable stack?
    Design a stack with the following operations. push(Stack s, x): Adds an item x to stack s pop(Stack s): Removes the top item from stack s merge(Stack s1, Stack s2): Merge contents of s2 into s1. Time Complexity of all above operations should be O(1). If we use array implementation of the stack, then
    8 min read
    The Stock Span Problem
    The stock span problem is a financial problem where we have a series of daily price quotes for a stock denoted by an array arr[] and the task is to calculate the span of the stock's price for all days. The span of the stock's price on ith day represents the maximum number of consecutive days leading
    11 min read
    Next Greater Element (NGE) for every element in given Array
    Given an array arr[] of integers, the task is to find the Next Greater Element for each element of the array in order of their appearance in the array. Note: The Next Greater Element for an element x is the first greater element on the right side of x in the array. Elements for which no greater elem
    9 min read
    Next Greater Frequency Element
    Given an array, for each element find the value of the nearest element to the right which is having a frequency greater than that of the current element. If there does not exist an answer for a position, then make the value '-1'.Examples: Input: arr[] = [2, 1, 1, 3, 2, 1]Output: [1, -1, -1, 2, 1, -1
    9 min read
    Maximum product of indexes of next greater on left and right
    Given an array arr[1..n], for each element at position i (1 <= i <= n), define the following:left(i) is the closest index j such that j < i and arr[j] > arr[i]. If no such j exists, then left(i) = 0.right(i) is the closest index k such that k > i and arr[k] > arr[i]. If no such k e
    11 min read
    Iterative Tower of Hanoi
    The Tower of Hanoi is a mathematical puzzle with three poles and stacked disks of different sizes. The goal is to move all disks from the source pole to the destination pole using an auxiliary pole, following two rules:Only one disk can be moved at a time.A larger disk cannot be placed on a smaller
    6 min read
    Sort a stack using a temporary stack
    Given a stack of integers, sort it in ascending order using another temporary stack.Examples: Input: [34, 3, 31, 98, 92, 23]Output: [3, 23, 31, 34, 92, 98]Explanation: After Sorting the given array it would be look like as [3, 23, 31, 34, 92, 98]Input: [3, 5, 1, 4, 2, 8]Output: [1, 2, 3, 4, 5, 8] Ap
    6 min read
    Reverse a stack without using extra space in O(n)
    Reverse a Stack without using recursion and extra space. Even the functional Stack is not allowed. Examples: Input : 1->2->3->4 Output : 4->3->2->1 Input : 6->5->4 Output : 4->5->6 We have discussed a way of reversing a stack in the below post.Reverse a Stack using Recu
    6 min read
    Delete middle element of a stack
    Given a stack with push(), pop(), and empty() operations, The task is to delete the middle element of it without using any additional data structure.Input: s = [10, 20, 30, 40, 50]Output: [50, 40, 20, 10]Explanation: The bottom-most element will be 10 and the top-most element will be 50. Middle elem
    8 min read
    Check if a queue can be sorted into another queue using a stack
    Given a Queue consisting of first n natural numbers (in random order). The task is to check whether the given Queue elements can be arranged in increasing order in another Queue using a stack. The operation allowed are: Push and pop elements from the stack Pop (Or Dequeue) from the given Queue. Push
    9 min read
    Check if an array is stack sortable
    Given an array arr[] of n distinct elements, where each element is between 1 and n (inclusive), determine if it is stack-sortable.Note: An array a[] is considered stack-sortable if it can be rearranged into a sorted array b[] using a temporary stack stk with the following operations:Remove the first
    6 min read
    Largest Rectangular Area in a Histogram
    Given a histogram represented by an array arr[], where each element of the array denotes the height of the bars in the histogram. All bars have the same width of 1 unit.Task is to find the largest rectangular area possible in a given histogram where the largest rectangle can be made of a number of c
    15+ min read
    Maximum of minimums of every window size in a given array
    Given an integer array arr[] of size n, the task is to find the maximum of the minimums for every window size in the given array, where the window size ranges from 1 to n.Example:Input: arr[] = [10, 20, 30]Output: [30, 20, 10]Explanation: First element in output indicates maximum of minimums of all
    14 min read
    Find index of closing bracket for a given opening bracket in an expression
    Given a string with brackets. If the start index of the open bracket is given, find the index of the closing bracket. Examples: Input : string = [ABC[23]][89] index = 0 Output : 8 The opening bracket at index 0 corresponds to closing bracket at index 8.Recommended PracticeClosing bracket indexTry It
    7 min read
    Maximum difference between nearest left and right smaller elements
    Given an array of integers, the task is to find the maximum absolute difference between the nearest left and the right smaller element of every element in the array. Note: If there is no smaller element on right side or left side of any element then we take zero as the smaller element. For example f
    12 min read
    Delete consecutive same words in a sequence
    Given an array of n strings arr[]. The task is to determine the number of words remaining after pairwise destruction. If two consecutive words in the array are identical, they cancel each other out. This process continues until no more eliminations are possible. Examples: Input: arr[] = ["gfg", "for
    7 min read
    Check mirror in n-ary tree
    Given two n-ary trees, determine whether they are mirror images of each other. Each tree is described by e edges, where e denotes the number of edges in both trees. Two arrays A[]and B[] are provided, where each array contains 2*e space-separated values representing the edges of both trees. Each edg
    11 min read
    Reverse a number using stack
    Given a number , write a program to reverse this number using stack.Examples: Input : 365Output : 563Input : 6899Output : 9986We have already discussed the simple method to reverse a number in this post. In this post we will discuss about how to reverse a number using stack.The idea to do this is to
    5 min read
    Reversing the first K elements of a Queue
    Given an integer k and a queue of integers, The task is to reverse the order of the first k elements of the queue, leaving the other elements in the same relative order.Only following standard operations are allowed on the queue. enqueue(x): Add an item x to rear of queuedequeue(): Remove an item fr
    13 min read
geeksforgeeks-footer-logo
Corporate & Communications Address:
A-143, 7th Floor, Sovereign Corporate Tower, Sector- 136, Noida, Uttar Pradesh (201305)
Registered Address:
K 061, Tower K, Gulshan Vivante Apartment, Sector 137, Noida, Gautam Buddh Nagar, Uttar Pradesh, 201305
GFG App on Play Store GFG App on App Store
Advertise with us
  • Company
  • About Us
  • Legal
  • Privacy Policy
  • In Media
  • Contact Us
  • Advertise with us
  • GFG Corporate Solution
  • Placement Training Program
  • Languages
  • Python
  • Java
  • C++
  • PHP
  • GoLang
  • SQL
  • R Language
  • Android Tutorial
  • Tutorials Archive
  • DSA
  • Data Structures
  • Algorithms
  • DSA for Beginners
  • Basic DSA Problems
  • DSA Roadmap
  • Top 100 DSA Interview Problems
  • DSA Roadmap by Sandeep Jain
  • All Cheat Sheets
  • Data Science & ML
  • Data Science With Python
  • Data Science For Beginner
  • Machine Learning
  • ML Maths
  • Data Visualisation
  • Pandas
  • NumPy
  • NLP
  • Deep Learning
  • Web Technologies
  • HTML
  • CSS
  • JavaScript
  • TypeScript
  • ReactJS
  • NextJS
  • Bootstrap
  • Web Design
  • Python Tutorial
  • Python Programming Examples
  • Python Projects
  • Python Tkinter
  • Python Web Scraping
  • OpenCV Tutorial
  • Python Interview Question
  • Django
  • Computer Science
  • Operating Systems
  • Computer Network
  • Database Management System
  • Software Engineering
  • Digital Logic Design
  • Engineering Maths
  • Software Development
  • Software Testing
  • DevOps
  • Git
  • Linux
  • AWS
  • Docker
  • Kubernetes
  • Azure
  • GCP
  • DevOps Roadmap
  • System Design
  • High Level Design
  • Low Level Design
  • UML Diagrams
  • Interview Guide
  • Design Patterns
  • OOAD
  • System Design Bootcamp
  • Interview Questions
  • Inteview Preparation
  • Competitive Programming
  • Top DS or Algo for CP
  • Company-Wise Recruitment Process
  • Company-Wise Preparation
  • Aptitude Preparation
  • Puzzles
  • School Subjects
  • Mathematics
  • Physics
  • Chemistry
  • Biology
  • Social Science
  • English Grammar
  • Commerce
  • World GK
  • GeeksforGeeks Videos
  • DSA
  • Python
  • Java
  • C++
  • Web Development
  • Data Science
  • CS Subjects
@GeeksforGeeks, Sanchhaya Education Private Limited, All rights reserved
We use cookies to ensure you have the best browsing experience on our website. By using our site, you acknowledge that you have read and understood our Cookie Policy & Privacy Policy
Lightbox
Improvement
Suggest Changes
Help us improve. Share your suggestions to enhance the article. Contribute your expertise and make a difference in the GeeksforGeeks portal.
geeksforgeeks-suggest-icon
Create Improvement
Enhance the article with your expertise. Contribute to the GeeksforGeeks community and help create better learning resources for all.
geeksforgeeks-improvement-icon
Suggest Changes
min 4 words, max Words Limit:1000

Thank You!

Your suggestions are valuable to us.

What kind of Experience do you want to share?

Interview Experiences
Admission Experiences
Career Journeys
Work Experiences
Campus Experiences
Competitive Exam Experiences