您的位置:首页 > 职场人生

栈和队列面试题之--实现一个有getMin功能的栈

2016-07-20 09:44 323 查看
题目:实现一个特殊的栈,在实现栈基本功能的的基础上,再实现返回栈中的最小元素操作

要求:pop push getMin操作的时间复杂度都是O(1)

看到题目可以想到大体分为两种思路,一是通过一个栈来实现;二则是通过两个栈来实现

我先实现用一个栈的

用一个栈的话就要一次压入两个值,data值,和记录的最小值Min,

方法是:向一个stack中压入数据data,第一次由于栈是空的,所以第一次压入的Min就是data,此时保存栈顶数据top;然后再向其中压入第二个数据,如果第二个数据大于第一个,则压入data之后再次压入top,如果第二个数据小于第一个则和第一次压入时一样。

pop的时候是直接pop栈顶元素即可,但是要记得判空的条件

代码实现如下:

template <typename T>
class getStackMin
{
public:
getStackMin()
{}
void Push(const T&data)
{
if (s.empty()||data<s.top())
{
s.push(data);
s.push(data);
}
else
{
T minData = s.top();
s.push(data);
s.push(minData);
}
}
void pop()
{
assert(!s.empty());
s.top();
s.pop();
}
T& top()
{
T minData = s.top();
s.pop();
T& ret = s.top();
return ret;
}


当然我是先压入data在压入min的这样的话第一次出栈取的直接是最小值,比较方便

其实也可以定义一个结构体,里面存入两个数据,其它的操作与上面的类似

struct Elem
{
T minData;
T data;
};


第二种是用两个栈,我觉得这种更加方便

data栈值用来压入数据,而min栈用来记录最小值,第一次是将data放入min栈 然后再次压入data的时候与min的栈顶进行比较,若大于就在min栈中重复压入min的栈顶元素,否则压入data;最后的min的栈顶元素即为最小值

//#include<stack>
//#include<iostream>
//using namespace std;
//class solution
//{
//  stack<int> StackData;
//  stack<int>StackMin;
//  void Push(int data)
//  {
//      StackData.push(data);
//      if (StackMin.empty())
//      {
//          StackMin.push(data);
//      }
//      else
//      {
//          if (data<StackData.top())
//          {
//              StackMin.push(data);
//          }
//          else
//          {
//              StackMin.push(StackMin.top);
//          }
//      }
//  }
//  void Pop()
//  {
//      StackData.pop();
//      StackMin.pop();
//  }
//  int top()
//  {
//      return StackData.top();
//  }
//  int MinData()
//  {
//      return StackData.top();
//  }
//};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: