Design a stack which can give maximum frequency element - GeeksforGeeks

06 Mar, 2022
Given N elements and the task is to implement a stack which removes and returns the maximum frequency element on every pop operation. If there’s a tie in the frequency then the topmost highest frequency element will be returned.Examples:  
Input: push(4) 8 push(6) 6 push(7) 7 push(6) 6 push(8); 4Output: pop() -> returns 6, as 6 is the most frequent (frequency of 6 = 2 ). pop() -> returns 8 (6 also has the highest frequency but it is not the topmost)  
 
Approach: Maintaining two HashMap, one is frequency HashMap which maps elements to their frequencies and other is setMap which maps all the element with same frequency in one group (Stack). FrequencyStack has 2 functions:  
push(int x): map the element (x) with frequency HashMap and update the maxfreq variable ( i.e. holds the maximum frequency till now ). setMap maintains a stack which contains all the elements with same frequency.pop(): First get the maxfreq element from setMap and then decrement the frequency of the popped element. After popping, if the stack becomes empty then decrement the maxfreq.
push(int x): map the element (x) with frequency HashMap and update the maxfreq variable ( i.e. holds the maximum frequency till now ). setMap maintains a stack which contains all the elements with same frequency.
pop(): First get the maxfreq element from setMap and then decrement the frequency of the popped element. After popping, if the stack becomes empty then decrement the maxfreq.
Below is the implementation of the above approach: 
C++
Java
Python3
C#
Javascript
// C++ implementation of the approach#include<bits/stdc++.h>using namespace std; // freqMap is to map element to its frequencymap<int, int> freqMap; // setMap is to map frequency to the// element list with this frequencymap<int, stack<int> > setMap; // Variable which stores maximum frequency// of the stack elementint maxfreq = 0; // Function to insert x in the stackvoid push(int x){     // Frequency of x    int freq = freqMap[x] + 1;     // Mapping of x with its frequency    freqMap[x]= freq;     // Update maxfreq variable    if (freq > maxfreq)        maxfreq = freq;     // Map element to its frequency list    // If given frequency list doesn't exist    // make a new list of the required frequency    setMap[freq].push(x);} // Function to remove maximum frequency elementint pop(){     // Remove element from setMap    // from maximum frequency list    int top = setMap[maxfreq].top();    setMap[maxfreq].pop();     // Decrement the frequency of the popped element    freqMap[top]--;     // If whole list is popped    // then decrement the maxfreq    if (setMap[maxfreq].size() == 0)        maxfreq--;    return top;} // Driver codeint main(){     // Push elements to the stack    push(4);    push(6);    push(7);    push(6);    push(8);     // Pop elements    cout << (pop()) << "\n" ;    cout << (pop());    return 0;} // This code is contributed by Arnab Kundu
// Java implementation of the approachimport java.util.*; public class freqStack {     // freqMap is to map element to its frequency    static Map<Integer, Integer> freqMap = new HashMap<>();     // setMap is to map frequency to the    // element list with this frequency    static Map<Integer, Stack<Integer> > setMap = new HashMap<>();     // Variable which stores maximum frequency    // of the stack element    static int maxfreq = 0;     // Function to insert x in the stack    public static void push(int x)    {         // Frequency of x        int freq = freqMap.getOrDefault(x, 0) + 1;         // Mapping of x with its frequency        freqMap.put(x, freq);         // Update maxfreq variable        if (freq > maxfreq)            maxfreq = freq;         // Map element to its frequency list        // If given frequency list doesn't exist        // make a new list of the required frequency        setMap.computeIfAbsent(freq, z -> new Stack()).push(x);    }     // Function to remove maximum frequency element    public static int pop()    {         // Remove element from setMap        // from maximum frequency list        int top = setMap.get(maxfreq).pop();         // Decrement the frequency of the popped element        freqMap.put(top, freqMap.get(top) - 1);         // If whole list is popped        // then decrement the maxfreq        if (setMap.get(maxfreq).size() == 0)            maxfreq--;        return top;    }     // Driver code    public static void main(String[] args)    {         // Push elements to the stack        push(4);        push(6);        push(7);        push(6);        push(8);         // Pop elements        System.out.println(pop());        System.out.println(pop());    }}
# Python3 implementation of the approach # freqMap is to map element to its frequencyfreqMap = {}; # setMap is to map frequency to the# element list with this frequencysetMap = {}; # Variable which stores maximum frequency# of the stack elementmaxfreq = 0; # Function to insert x in the stackdef push(x) :    global maxfreq;    if x not in freqMap :        freqMap[x] = 0             # Frequency of x    freq = freqMap[x] + 1;         # Mapping of x with its Frequency    freqMap[x]= freq         # Update maxfreq Variable    if (freq > maxfreq) :        maxfreq = freq             # Map element to its frequency list    # If given frequency list doesn't exist    # make a new list of the required frequency    if freq not in setMap :        setMap[freq] = []         setMap[freq].append(x); # Function to remove maximum frequency elementdef pop() :     global maxfreq         # Remove element from setMap    # from maximum frequency list    top = setMap[maxfreq][-1];    setMap[maxfreq].pop();         # Decrement the frequency    # of the popped element    freqMap[top] -= 1;         # If whole list is popped    # then decrement the maxfreq    if (len(setMap[maxfreq]) == 0) :        maxfreq -= 1;             return top; # Driver codeif __name__ == "__main__" :     # Push elements to the stack    push(4);    push(6);    push(7);    push(6);    push(8);     # Pop elements    print(pop()) ;    print(pop()); # This code is contributed by AnkitRai01
// C# implementation of the approachusing System;using System.Collections.Generic;class GFG {         // freqMap is to map element to its frequency    static Dictionary<int, int> freqMap = new Dictionary<int, int>();      // setMap is to map frequency to the    // element list with this frequency    static Dictionary<int, Stack<int>> setMap = new Dictionary<int, Stack<int>>();      // Variable which stores maximum frequency    // of the stack element    static int maxfreq = 0;      // Function to insert x in the stack    static void push(int x)    {        int freq = 1;                 // Frequency of x        if(freqMap.ContainsKey(x))        {            freq = freq + freqMap[x];        }          // Mapping of x with its frequency        freqMap[x] = freq;          // Update maxfreq variable        if (freq > maxfreq)            maxfreq = freq;          // Map element to its frequency list        // If given frequency list doesn't exist        // make a new list of the required frequency        if(!setMap.ContainsKey(freq))        {            setMap[freq] = new Stack<int>();        }              setMap[freq].Push(x);    }      // Function to remove maximum frequency element    static int pop()    {          // Remove element from setMap        // from maximum frequency list        int top = setMap[maxfreq].Peek();        setMap[maxfreq].Pop();          // Decrement the frequency of the popped element        freqMap[top] = freqMap[top] - 1;          // If whole list is popped        // then decrement the maxfreq        if (setMap[maxfreq].Count == 0)            maxfreq--;        return top;    }       static void Main() {    // Push elements to the stack    push(4);    push(6);    push(7);    push(6);    push(8);      // Pop elements    Console.WriteLine(pop()) ;    Console.WriteLine(pop());  }} // This code is contributed by rameshtravel07.
<script> // Javascript implementation of the approach // freqMap is to map element to its frequencyvar freqMap = new Map(); // setMap is to map frequency to the// element list with this frequencyvar setMap = new Map(); // Variable which stores maximum frequency// of the stack elementvar maxfreq = 0; // Function to insert x in the stackfunction push(x){     // Frequency of x    if(!freqMap.has(x))        freqMap.set(x, 1)    else        freqMap.set(x, freqMap.get(x)+1)         var freq = freqMap.get(x)     // Mapping of x with its frequency    freqMap.set(x, freq);     // Update maxfreq variable    if (freq > maxfreq)        maxfreq = freq;     // Map element to its frequency list    // If given frequency list doesn't exist    // make a new list of the required frequency    if(!setMap.has(freq))    {        setMap.set(freq, [x])    }    else    {        var tmp = setMap.get(freq);        tmp.push(x);        setMap.set(freq, tmp);    }} // Function to remove maximum frequency elementfunction pop(){     // Remove element from setMap    // from maximum frequency list    var tmp = setMap.get(maxfreq);    var top = tmp[tmp.length-1];    tmp.pop();    setMap.set(maxfreq, tmp);     // Decrement the frequency of the popped element    if(freqMap.has(top))        freqMap.set(top, freqMap.get(top)-1)     // If whole list is popped    // then decrement the maxfreq    if (setMap.get(maxfreq).length == 0)        maxfreq--;    return top;} // Driver code// Push elements to the stackpush(4);push(6);push(7);push(6);push(8); // Pop elementsdocument.write( (pop()) + "<br>");document.write( (pop())); // This code is contributed by itsok.</script>
6
8
 
andrew1234
ankthon
itsok
rameshtravel07
nikhatkhan11
frequency-counting
Hash
Stack
Hash
Stack
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Rearrange an array such that arr[i] = i
Quadratic Probing in Hashing
Hashing in Java
Advantages of BST over Hash Table
Load Factor and Rehashing
Stack Data Structure (Introduction and Program)
Stack in Python
Stack Class in Java
Check for Balanced Brackets in an expression (well-formedness) using Stack
Program for Tower of Hanoi