Stack

overflow

Implement Queue using Stack

class MyQueue {
	Stack stack;
	int top;

	public MyQueue() {
		stack = new Stack();
	}

	public void push(int x) {
		Stack temp = new Stack();
		if (stack.isEmpty()) {
			stack.push(x);
		} else {
			while (!stack.isEmpty()) {
				temp.push(stack.pop());
			}
			stack.push(x);
			while (!temp.isEmpty()) {
				stack.push(temp.pop());
			}
		}
	}

	public int pop() {
		return (int) stack.pop();
	}

	public int peek() {
		return (int) stack.peek();
	}

	public boolean empty() {
		return stack.isEmpty();
	}
}

Balanced Parenthesis

import java.util.Stack;

class Solution {

	static public boolean isValid(String s) {
		Stack<Character> stck = new Stack<>();

		for (char bracket : s.toCharArray()) {
			if (bracket == '(' || bracket == '[' || bracket == '{') {
				stck.push(bracket);
			} else {
				try {
					char lstBracker = stck.peek();
					if (lstBracker == '(' && bracket == ')') {
						stck.pop();
					} else if (lstBracker == '[' && bracket == ']') {
						stck.pop();
					} else if (lstBracker == '{' && bracket == '}') {
						stck.pop();
					} else {
						return false;
					}
				} catch (Exception e) {
					return false;
				}
			}
		}

		return stck.size() == 0 ? true : false;

	}

	public static void main(String[] args) {
		System.out.println(isValid("{()}[]"));
	}
}

Two stacks in an array(Useless Question)

        import java.io.*;
        import java.util.*;

class TwoStacks {
    int cap;
    int top1, top2;
    int arr[];

    TwoStacks(int n) {
        arr = new int[n];
        cap = n;
        top1 = -1;
        top2 = cap;
    }

    void push1(int x) {
        if (top1 < top2 - 1) {
            top1++;
            arr[top1] = x;
        } else {
            System.out.println("Stack Overflow");
            System.exit(1);
        }
    }

    void push2(int x) {
        if (top1 < top2 - 1) {
            top2--;
            arr[top2] = x;
        } else {
            System.out.println("Stack Overflow");
            System.exit(1);
        }
    }

    int pop1() {
        if (top1 >= 0) {
            int x = arr[top1];
            top1--;
            return x;
        } else {
            System.out.println("Stack Underflow");
            System.exit(1);
        }
        return 0;
    }

    int pop2() {
        if (top2 < cap) {
            int x = arr[top2];
            top2++;
            return x;
        } else {
            System.out.println("Stack Underflow");
            System.exit(1);
        }
        return 0;
    }
}

class Main {

    public static void main(String[] args) {

        TwoStacks ts = new TwoStacks(5);
        ts.push1(5);
        ts.push2(10);
        ts.push2(15);
        ts.push1(11);
        ts.push2(7);
        System.out.println("Popped element from stack1 is: " + ts.pop1());
        ts.push2(40);
        System.out.println("Popped element from stack2 is: " + ts.pop2());

    }

}

K Stacks in an array(UseLess Question)

class kStacks {
    int arr[];
    int top[];
    int next[];
    int cap, k;
    int freeTop;

    kStacks(int k1, int n) {
        k = k1;
        cap = n;
        arr = new int[cap];
        top = new int[k];
        next = new int[cap];

        for (int i = 0; i < k; i++)
            top[i] = -1;

        freeTop = 0;
        for (int i = 0; i < cap - 1; i++)
            next[i] = i + 1;
        next[cap - 1] = -1;
    }

    boolean isFull() {
        return (freeTop == -1);
    }

    boolean isEmpty(int sn) {
        return (top[sn] == -1);
    }

    void push(int x, int sn) {
        if (isFull()) {
            System.out.print("\nStack Overflow\n");
            return;
        }

        int i = freeTop;
        freeTop = next[i];
        next[i] = top[sn];
        top[sn] = i;
        arr[i] = x;
    }

    int pop(int sn) {
        if (isEmpty(sn)) {
            System.out.print("\nStack Underflow\n");
            return Integer.MAX_VALUE;
        }

        int i = top[sn];
        top[sn] = next[i];
        next[i] = freeTop;
        freeTop = i;
        return arr[i];
    }

}

class Main {

    public static void main(String[] args) {

        int k = 3, n = 10;
        kStacks ks = new kStacks(k, n);

        ks.push(15, 2);
        ks.push(45, 2);

        ks.push(17, 1);
        ks.push(49, 1);
        ks.push(39, 1);

        ks.push(11, 0);
        ks.push(9, 0);
        ks.push(7, 0);

        System.out.println("Popped element from stack 2 is " + ks.pop(2));
        System.out.println("Popped element from stack 1 is " + ks.pop(1));
        System.out.println("Popped element from stack 0 is " + ks.pop(0));

    }

}

Stock Span Problem

        import java.io.*;
        import java.util.*;

class GFG {

    public static void printSpan(int arr[], int n) {
        Stack<Integer> s = new Stack<>();
        s.add(0);
        System.out.print(1 + " ");
        for (int i = 1; i < n; i++) {
            while (s.isEmpty() == false && arr[s.peek()] <= arr[i]) {
                s.pop();
            }
            int span = s.isEmpty() ? i + 1 : i - s.peek();
            System.out.print(span + " ");
            s.push(i);
        }
    }

    public static void main(String[] args) {

        int[] arr = new int[]{18, 12, 13, 14, 11, 16};

        printSpan(arr, arr.length);

    }

}

Previous Greater Element

        import java.io.*;
        import java.util.*;

class GFG {

    public static void printPrevGreater(int arr[], int n) {

        Stack<Integer> s = new Stack<>();
        s.add(arr[0]);
        for (int i = 0; i < n; i++) {
            while (s.isEmpty() == false && s.peek() <= arr[i])
                s.pop();
            int pg = s.isEmpty() ? -1 : s.peek();
            System.out.print(pg + " ");
            s.add(arr[i]);
        }
    }

    public static void main(String[] args) {

        int[] arr = new int[]{20, 30, 10, 5, 15};

        printPrevGreater(arr, arr.length);

    }

}

Next Greater Element

import java.io.*;
import java.util.*;

class GFG {

    public static ArrayList<Integer> nextGreater(int arr[],int n){
        ArrayList<Integer> v=new ArrayList<>();
        Stack <Integer> s=new Stack<>();
        s.add(arr[n-1]);v.add(-1);
        for(int i=n-2;i>=0;i--){
            while(s.isEmpty()==false && s.peek()<=arr[i])
                s.pop();
            int ng=s.isEmpty()?-1:s.peek();
            v.add(ng);
            s.add(arr[i]);
        }
        Collections.reverse(v);
        return v;
    }
    public static void main (String[] args) {

        int[] arr=new int[]{5,15,10,8,6,12,9,18};

        for(int x: nextGreater(arr,arr.length)){
            System.out.print(x + " ");   
        }  

    }

}

Largest Rectangular Area in a Histogram (Part 1)

import java.io.*;
import java.util.*;

class GFG {

    public static int getMaxArea(int arr[], int n) {
        int res = 0;
        int[] ps = new int[n];
        int[] ns = new int[n];

        Stack<Integer> s = new Stack<>();
        s.add(0);
        for (int i = 0; i < n; i++) {
            while (s.isEmpty() == false && arr[s.peek()] >= arr[i])
                s.pop();
            int pse = s.isEmpty() ? -1 : s.peek();
            ps[i] = pse;
            s.push(i);
        }

        while (s.isEmpty() == false) {
            s.pop();
        }

        s.push(n - 1);
        for (int i = n - 1; i > 0; i--) {
            while (s.isEmpty() == false && arr[s.peek()] >= arr[i])
                s.pop();
            int nse = s.isEmpty() ? n : s.peek();
            ns[i] = nse;
            s.add(i);
        }

        for (int i = 0; i < n; i++) {
            int curr = arr[i];
            curr += (i - ps[i] - 1) * arr[i];
            curr += (ns[i] - i - 1) * arr[i];
            res = Math.max(res, curr);
        }
        return res;

    }

    public static void main(String[] args) {
        int[] arr = new int[]{6, 2, 5, 4, 1, 5, 6};
        System.out.print("Maximum Area: " + getMaxArea(arr, arr.length));
    }
}

Largest Rectangular Area in a Histogram (Part 2)

import java.io.*;
import java.util.*;

class GFG {

    public static int getMaxArea(int arr[], int n) {
        Stack<Integer> s = new Stack<>();
        int res = 0;
        int tp;
        int curr;
        for (int i = 0; i < n; i++) {
            while (s.isEmpty() == false && arr[s.peek()] >= arr[i]) {
                tp = s.peek();
                s.pop();
                curr = arr[tp] * (s.isEmpty() ? i : i - s.peek() - 1);
                res = Math.max(res, curr);
            }
            s.add(i);
        }
        while (s.isEmpty() == false) {
            tp = s.peek();
            s.pop();
            curr = arr[tp] * (s.isEmpty() ? n : n - s.peek() - 1);
            res = Math.max(res, curr);
        }

        return res;

    }

    public static void main(String[] args) {
        int[] arr = new int[]{6, 2, 5, 4, 1, 5, 6};
        System.out.print("Maximum Area: " + getMaxArea(arr, arr.length));
    }
}

Largest Rectangle with all 1's (in a matrix)

import java.io.*;
import java.util.*;

class GFG {

    public static int largestHist(int R, int C, int arr[]) {
        Stack<Integer> result = new Stack<Integer>();

        int top_val;
        int max_area = 0;
        int area = 0;

        int i = 0;
        while (i < C) {
            if (result.empty() || arr[result.peek()] <= arr[i])
                result.push(i++);

            else {

                top_val = arr[result.peek()];
                result.pop();
                area = top_val * i;

                if (!result.empty())
                    area = top_val * (i - result.peek() - 1);
                max_area = Math.max(area, max_area);
            }
        }

        while (!result.empty()) {
            top_val = arr[result.peek()];
            result.pop();
            area = top_val * i;
            if (!result.empty())
                area = top_val * (i - result.peek() - 1);

            max_area = Math.max(area, max_area);
        }
        return max_area;
    }

    static int maxRectangle(int R, int C, int mat[][]) {
        int res = largestHist(R, C, mat[0]);

        for (int i = 1; i < R; i++) {

            for (int j = 0; j < C; j++)

                if (mat[i][j] == 1)
                    mat[i][j] += mat[i - 1][j];

            res = Math.max(res, largestHist(R, C, mat[i]));
        }

        return res;
    }

    public static void main(String[] args) {
        int R = 4;
        int C = 4;

        int A[][] = {
                {0, 1, 1, 0},
                {1, 1, 1, 1},
                {1, 1, 1, 1},
                {1, 1, 0, 0},
        };
        System.out.print("Area of maximum rectangle is " + maxRectangle(R, C, A));
    }
}

Stack with getMin() in O(1)

import java.io.*;
import java.util.*;

class MyStack {

    Stack<Integer> ms;
    Stack<Integer> as;

    MyStack(){
        ms=new Stack<>();
        as=new Stack<>();
    }

void push(int x) {

      if(ms.isEmpty() ) {
          ms.add(x);as.add(x);return;
      }

      ms.add(x);

      if(as.peek()>=ms.peek())
        as.add(x);
   }

void pop() {

    if(as.peek()==ms.peek())
        as.pop();
    ms.pop();

   }

int top() {
     return ms.peek();
   }

int getMin() {
      return as.peek();
   }
}

class GFG {

    public static void main(String[] args) 
    { 
        MyStack s=new MyStack();;
        s.push(4);
        s.push(5);
        s.push(8);
        s.push(1);
        s.pop();

        System.out.print(" Minimum Element from Stack: " + s.getMin() );

    } 
}

Design a Stack with getMin() in O(1) Space

Assuming all Elements Positive

import java.io.*;
import java.util.*;

class MyStack {

    Stack<Integer> s;
    int min;

    MyStack() {
        s = new Stack<>();
    }

    void push(int x) {

        if (s.isEmpty()) {
            min = x;
            s.add(x);
        } else if (x <= min) {
            s.add(x - min);
            min = x;
        } else {
            s.add(x);
        }
    }

    int pop() {

        int t = s.peek();
        s.pop();
        if (t <= 0) {
            int res = min;
            min = min - t;
            return res;
        } else {
            return t;
        }
    }

    int peek() {
        int t = s.peek();
        return ((t <= 0) ? min : t);
    }

    int getMin() {
        return min;
    }
}

class GFG {

    public static void main(String[] args) {
        MyStack s = new MyStack();
        ;
        s.push(4);
        s.push(5);
        s.push(8);
        s.push(1);
        s.pop();

        System.out.print(" Minimum Element from Stack: " + s.getMin());
    }
}

Handles Negatives

import java.io.*;
import java.util.*;

class MyStack {

    Stack<Integer> s;
    int min;

    MyStack(){
        s=new Stack<>();
    }

    void push(int x) {

        if(s.isEmpty() ) {
            min=x;
            s.add(x);
        }
        else if(x<=min){
            s.add(2*x-min);
            min=x;
        }else{
            s.add(x);
        }
    }

    int pop() {

        int t=s.peek();s.pop();
        if(t<=min){
            int res=min;
            min=2*min-t;
            return res;
        }else{
            return t;
        }
    }

    int peek() {
        int t=s.peek();
        return ((t<=min)? min : t);
    }

    int getMin() {
        return min;
    }
}

class GFG {

    public static void main(String[] args)
    {
        MyStack s=new MyStack();;
        s.push(4);
        s.push(5);
        s.push(8);
        s.push(1);
        s.pop();

        System.out.print(" Minimum Element from Stack: " + s.getMin() );
    }
}

Last updated