栈和队列面试题之--实现一个有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();
//  }
//};
好的,下面是关于用C语言编写单调队列和单调的一些基本思路: 单调队列: 单调队列是一种能够在O(1)时间内完成以下操作的队列:在队尾添加元素、在队首删除元素、查找队列中的最小(或最大)元素。 在C语言中,可以使用数组模拟队列,并通过双端队列的思想来实现单调队列。具体实现时,我们可以使用一个数组来存储队列中的元素,并使用两个指针front和rear分别指向队首和队尾元素。为了实现单调性,我们需要维护一个递增(或递减)的队列,即队列中的元素按照一定的顺序排列。为了实现这个目标,我们可以在插入元素时,从队尾开始遍历队列,将所有比插入元素小的元素都出队,最后将插入元素入队。这样,我们就可以保证队列中的元素是单调递增的。查找最小元素时,只需要返回队首元素即可。 以下是用C语言实现单调队列的基本代码: ```c #include <stdio.h> #define MAXSIZE 1000 int queue[MAXSIZE]; // 队列 int front = 0, rear = 0; // 队首和队尾指针 // 判断队列是否为空 int isEmpty() { return front == rear; } // 判断队列是否已满 int isFull() { return rear == MAXSIZE; } // 在队尾添加元素 void enqueue(int x) { while (rear > front && queue[rear - 1] > x) { rear--; } queue[rear++] = x; } // 在队首删除元素 void dequeue() { if (!isEmpty()) { front++; } } // 查找队列中的最小元素 int getMin() { if (!isEmpty()) { return queue[front]; } return -1; } int main() { enqueue(3); enqueue(1); enqueue(5); dequeue(); printf("%d\n", getMin()); return 0; } ``` 单调: 单调是一种能够在O(1)时间内完成以下操作的:在顶添加元素、在顶删除元素、查找中的最小(或最大)元素。 与单调队列类似,我们也可以使用数组模拟,并通过的特性来实现单调。为了实现单调性,我们需要维护一个递增(或递减)的,即中的元素按照一定的顺序排列。为了实现这个目标,我们在插入元素时,从顶开始遍历,将所有比插入元素小的元素都出,最后将
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值