1.实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
对于这个问题,我们都知道,栈的入栈和出栈时间复杂度都是O(1),那么我们所面临的问题就是需要有一个接口来实现返回最小值的操作,且这个操作的时间复杂度必须是O(1)。
这里有两种思路可供选择:
(1)前提:这里有一组数据,利用一个栈,将这些数据需要入栈,而在入栈的时候遵循这样的规律,将一个数据入栈时,接下来立刻把当前栈中的最小值也入栈,接着将下一个数据入栈,也遵从上面的规律。
这种方法是一种以空间换时间的做法。
但是这种方法有一个小小的缺陷,那就是获取栈顶元素时比较尴尬,需要先将最小值出栈,然后获取栈顶元素,然后再将最小值入栈,这种方法比较麻烦。
代码如下:
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include <assert.h>
using namespace std;
#include<vector>
#include<stack>
template<class T>
class Stack
{
public:
void Push(const T& val)
{
if (s.empty())
{
s.push(val);
s.push(val);
}
else
{
T min = s.top();
if (val < min)
{
s.push(val);
s.push(val);
}
else
{
s.push(val);
s.push(min);
}
}
}
void Pop()
{
if (!s.empty())
{
s.pop();
s.pop();
}
}
T Min()
{
if (!s.empty())
{
return s.top();
}
assert(false);
return 0;
}
private:
stack<T> s;
};
(2)
利用两个栈来实现,一个栈用来保存数据,另一个栈用来保存当前数据栈中的最小值。
缺陷:min栈中会有很多冗余值。
template<class T>
class Stack
{
public:
void Push(const T& val)
{
_data.push(val);