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

题目:实现一个特殊的栈,在实现栈基本功能的的基础上,再实现返回栈中的最小元素操作
要求: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();
//  }
//};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值