一道经典的面试题,让实现一种数据结构,支持 push(),pop(),findMin() 三种操作,并且时间复杂度不能超过O(logN)
class MyStack
{
public:
//通过构造函数进行初始化
MyStack(int length) {
data = new int[length];
minData = new int[length];
dataIndex = -1;
minIndex = -1;
min = 0;
size = 0;
}
//判断数组是否为空
bool isEmpty() {
return size == 0;
}
//入栈,最小值序列可能改变
void push(int k) {
++size;
data[++dataIndex] = k;
if (dataIndex == 0 || k < min) {
min = k;
minData[++minIndex] = k;
}
}
//出栈,最小值序列可能改变
int pop() {
--size;
int a = data[dataIndex--];
if (a == minData[minIndex] && dataIndex >= 0) {
min = minData[--minIndex];
}
return a;
}
//找到数据结构中的最小值
int findMin() {
return minData[minIndex];
}
private:
int *data; //支持push和pop的数组
int *minData; //支持findMin操作的数组,存储最小值序列
int dataIndex; //data数组的下标索引
int minIndex; //minData数组的下标索引
int min; //最小值
int size; //元素的个数
};