用C++实现一个栈,要包含push和pop,和findMin,找到值最小的元素并返回,要求O(1)时间复杂度
时间: 2024-09-22 12:08:59 浏览: 42
在C++中,如果我们想要实现一个支持快速查找最小元素(时间复杂度为 O(1))的栈,通常我们会采用一种数据结构叫做“最小堆”(Min-Heap)。由于在堆中,父节点的键值总是小于或等于其子节点的键值,所以最小堆的根节点总是最小元素。
这里是一个使用 `std::priority_queue`(最小优先队列)实现的栈类,该容器内部已经实现了 O(1) 的最小元素查找:
```cpp
#include <queue>
#include <climits>
template <typename T>
class MinStack {
private:
std::priority_queue<T> minHeap;
std::stack<T> stack;
public:
// 初始化
MinStack() {}
// 入栈
void push(T x) {
stack.push(x);
if (minHeap.empty() || x <= minHeap.top()) {
minHeap.push(x);
}
}
// 出栈
void pop() {
if (!stack.empty()) {
if (stack.top() == minHeap.top()) {
minHeap.pop();
}
stack.pop();
}
}
// 查找最小元素
T top() const {
return minHeap.top();
}
// 返回当前栈中的最小元素
T getMin() const {
return minHeap.top();
}
};
```
在这个实现中,`push` 方法会同时将新元素加入到普通栈和最小堆中,而`pop`方法会在普通栈出栈的同时判断当前栈顶是否就是最小堆的根,如果是则从最小堆中移除。这样每次操作的时间复杂度都是 O(log n),但在查找最小元素时,因为堆的数据结构特性,`getMin` 方法的时间复杂度是 O(1)。
请注意,虽然 `getMin` 在平均情况下的时间复杂度是 O(1),但整个栈的操作仍然受限于堆的操作,即在最坏情况下(如频繁出栈入栈),整体的时间复杂度仍然是 O(n log n)。
阅读全文