📅  最后修改于: 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
。