C++实现返回栈中最小元素的操作(时间复杂度O(1))

时间:2024-04-11 18:52:00

1. 题目

实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

要求:

  1. pop、push、getMin操作的时间复杂度都是O(1)O(1)
  2. 设计的栈类型可以使用现成的栈结构。

2. 思路

  1. 用两个栈来实现,栈sData存放入栈元素,栈sMin存放最小值。
  2. 按照元素入栈顺序,将要入栈的第一个元素,同时压入两个栈中。后续每个元素入栈时,与sMin栈中栈顶元素比较大小,若入栈元素data 小于sMin栈顶元素,则把data同时压入两个栈中,若data大于sMin栈中栈顶元素,则只压入栈sData中。出栈时,判断两个栈顶元素是否相等,若相等则两个栈同时执行出栈操作,不相等则,只有栈sData执行出栈操作。

3. 代码

#include <iostream>
#include <exception>
#include <stack>

template<class T> class MinStack {
 public:
     void push(const T& num);
     T pop();
     T getMin() const;
 private:
    std::stack<T> sData;    // 数据栈
    std::stack<T> sMin;     // 最小栈
};
template<typename T>
T MinStack<T>::getMin() const{
    if (sMin.empty()) {
        throw std::runtime_error("min stack is empty");
    } else {
        return sMin.top();  // top是获取栈顶元素
    }
}
template<class T>
void MinStack<T>::push(const T& num) {
    if (sData.empty()) {    // 如果当前数据栈为空
        sData.push(num);
        sMin.push(num);
    } else if (num < getMin()){ // 如果当前数小于sMin栈的元素
        sData.push(num);
        sMin.push(num);
    } else {
        sData.push(num);
    }
}
template<class T>
T MinStack<T>::pop() {
    if (sData.top() == sMin.top()) {    // 如果sData栈顶元素等于sMin栈顶元素
        sData.pop();
        sMin.pop();
    } else {
        sData.pop();
    }
}

int main() {
    MinStack<int> s;
	s.push(5);
	s.push(3);
	s.push(2);
	s.push(4);
	s.push(6);
	s.push(3);
	s.push(1);
	std::cout << s.getMin() << std::endl;
	s.pop();
	std::cout << s.getMin() << std::endl;
	s.pop();
	std::cout << s.getMin() << std::endl;
	s.pop();
	std::cout << s.getMin() << std::endl;
	s.pop();
	std::cout << s.getMin() << std::endl;
	s.pop();
	std::cout << s.getMin() << std::endl;
	s.pop();

    return 0;
}

C++实现返回栈中最小元素的操作(时间复杂度O(1))

4. 参考文章

  1. 【面试题】实现一个栈要求Push,Pop,Min(返回栈中最小值的操作)的时间复杂度为O(1)
  2. 实现带有返回栈中最小元素功能的栈结构
  3. C++ 类模板和模板类