📜  设计一个可以给出最大频率元素的堆栈(1)

📅  最后修改于: 2023-12-03 14:57:39.895000             🧑  作者: Mango

设计一个可以给出最大频率元素的堆栈

简介

该堆栈可以维护任意类型的元素,并记录其中出现频率最高的元素。在对堆栈进行操作时,会自动更新最大频率元素。

实现

该堆栈基于Python语言实现,具体代码如下:

from collections import defaultdict


class FreqStack:
    def __init__(self):
        self.stack = []
        self.freq = defaultdict(int)
        self.maxfreq = 0

    def push(self, x: int) -> None:
        self.freq[x] += 1
        self.maxfreq = max(self.maxfreq, self.freq[x])
        self.stack.append(x)

    def pop(self) -> int:
        for i in range(len(self.stack)-1, -1, -1):
            if self.freq[self.stack[i]] == self.maxfreq:
                self.freq[self.stack[i]] -= 1
                if self.freq[self.stack[i]] == 0:
                    self.maxfreq -= 1
                return self.stack.pop(i)

    def get_maxfreq_elem(self) -> int:
        for elem, freq in self.freq.items():
            if freq == self.maxfreq:
                return elem

该堆栈使用了一个Python内置的字典类型defaultdict,用于记录每个元素出现的频率。在元素入栈时,我们更新字典的值,同时维护一个最大频率maxfreq。在元素出栈时,我们从栈顶向下遍历,找到频率等于maxfreq的元素,并将其出栈。

除此之外,我们提供了一个获取最大频率元素的接口get_maxfreq_elem(),用于在需要时获取出现频率最高的元素。

示例
stack = FreqStack()
stack.push(1)
stack.push(2)
stack.push(3)
stack.push(2)
stack.push(1)
stack.push(2)
assert stack.pop() == 2
assert stack.pop() == 1
assert stack.pop() == 2
assert stack.get_maxfreq_elem() == 3

上述示例演示了如何使用该堆栈操作数据,并最终获取到它的最大频率元素3