Для кожного числа будемо зберігати кількість його входжень у стеку freq[x]. Як структуру даних для зберігання оберемо map.
Оголосимо масив стеків vector<stack<int>> st, де містить елементи, які зустрічаються у стеку рівно i + 1 раз (нумерація елементів масиву починається з нуля). Порядок елементів у відповідає порядку їх додавання у стек.
Нехай число додається у стек -ий раз. Якщо стек st[k - 1] ще не створений, додамо його за допомогою push_back. Потім покладемо на вершину стеку st[k - 1].

При видаленні елемента треба дістати верхній елемент з найостаннішого непорожнього стеку.

Наприклад, якщо далі буде виконуватись лише операція pop, то елементи будуть видалятися з стеку в наступному порядку: 4, 5, 4, 6, 5, 4.
Приклад
Розглянемо порядок додавання елементів у масив стеків на наступному прикладі.

При видаленні елементи будуть витягуватися в наступному порядку: 1, 5, 1, 5, 2, 6, 1, 5.
Реалізація алгоритму
Для роботи з частотним стеком оголосимо клас FreqStack.
class FreqStack
{
public:Оголосимо:
відображення , де freq[x] зберігає кількість входжень елемента у стеку;
масив стеків ;
map<int, int> freq;
vector<stack<int>> st;Функція push додає у стек елемент .
void push(int x)
{
int f = freq[x];
freq[x] = f + 1;
if (f == st.size()) st.push_back(stack<int>());
st[f].push(x);
}Функція pop витягує елемент з стеку.
int pop()
{
int x = st.back().top();
st.back().pop();
if (st.back().empty()) st.pop_back();
freq[x]--;
return x;
}
};Основна частина програми. Читаємо вхідні дані. Моделюємо роботу стеку.
while (cin >> str)
{
if (str == "push")
{
cin >> n;
fs.push(n);
}
else // pop
cout << fs.pop() << endl;
}