2.设计包含min 函数的栈。
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
要求函数min、push 以及pop 的时间复杂度都是O(1)。
思路:
1、min,push,pop都需要时间复杂度为O(1), 所以树,堆等数据结构都不能用
2、栈只有通过push来添加元素,pop来删除元素,min操作只是获取元素数据,并不进行删除操作
3、min最小元素也具有栈的特性,
如果push的元素小于min,则min等于新加入的元素,
如果pop的元素等于最小元素,则min为上一个最小元素(并不是两个最小元素之间的值)
/*
2.设计包含min 函数的栈。
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
要求函数min、push 以及pop 的时间复杂度都是O(1)。
*/
/*
思路:
1、min,push,pop都需要时间复杂度为O(1), 所以树,堆等数据结构都不能用
2、栈只有通过push来添加元素,pop来删除元素,min操作只是获取元素数据,并不进行删除操作
3、min最小元素也具有栈的特性,
如果push的元素小于min,则min等于新加入的元素,
如果pop的元素等于最小元素,则min为上一个最小元素(并不是两个最小元素之间的值)
*/
#ifndef INTERVIEW_1_H
#define INTERVIEW_1_H
#include <vector>
#include <cassert>
template <typename T>
class StackWithMin
{
public:
void push(const T &data)
{
dataStack.push_back(data);
if (0 == minStack.size())
{
minStack.push_back(data);
}
else if (minStack[minStack.size() - 1] > data)
{
minStack.push_back(data);
}
}
void pop()
{
assert(!empty());
if (!empty())
{
if (dataStack[dataStack.size() - 1] == minStack[minStack.size() - 1])
{
minStack.pop_back();
}
dataStack.pop_back();
}
}
T& min()
{
assert(!empty());
return minStack[minStack.size() - 1];
}
T& top()
{
assert(!empty());
return dataStack[dataStack.size() - 1];
}
bool empty()
{
if (dataStack.size() == 0)
{
return true;
}
return false;
}
private:
std::vector<T> dataStack;
std::vector<T> minStack;
};
#endif
#include "Interview_2.h"
#include <iostream>
using namespace std;
int main(void)
{
StackWithMin<int> stack;
int arr[5] = {5, 3, 4, 1, 2};
for (int index = 0; index < 5; index++)
{
stack.push(arr[index]);
}
for (int index = 0; index < 5; index++)
{
cout << stack.min() << endl;
stack.pop();
}
system("Pause");
return 0;
}
// 原题目地址: http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html?87150