Min Stack

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

  • push(x) -- Push element x onto stack.
  • pop() -- Removes the element on top of the stack.
  • top() -- Get the top element.
  • getMin() -- Retrieve the minimum element in the stack.

使用C++编程,其中使用了标准库中的容器stack,使用两个stack,一个用来存放最小优先的栈s1,一个用来存放所以元素s2。

对于push操作,如果x小于等于s1中的栈顶元素,则将x压入s1和s2,否则x大于s1的栈顶元素,则将x只压入s2中。

对于pop操作,如果要出栈,则正常情况下,从s2中弹出栈顶元素,但是当s1的栈顶元素与s2的栈顶元素相同的时候,则需要将s1和s2的栈顶元素都弹出来

对于top操作,访问栈顶元素,只有s2不为空,就可以直接访问栈顶元素

对于getMin擦,从s1中返回的栈顶元素就是最小的元素

C++完整代码如下:

#include<iostream>
#include<stack>
using namespace std;

class MinStack {
public:
    void push(int x) {
        if(s2.empty())
        {
            s1.push(x);
            s2.push(x);
            return;
        }
        int tmp=s1.top();
        if(x<=tmp)
            s1.push(x);
        s2.push(x);
    }

    void pop() {
        if(!s2.empty())
        {
            if(s1.top()==s2.top())
                s1.pop();
            s2.pop();
        }
    }

    int top() {
        if(!s2.empty())
            return s2.top();
        return 0;
    }
//s1为空的时候,s2同样也会为空
    int getMin() {
        if(!s1.empty())
            return s1.top();
        return 0;
    }
private:
    stack<int> s1;//存放最小值
    stack<int> s2;//存放所有的元素
};

int main()
{
    MinStack minstack;
    minstack.push(100);
    minstack.push(24);
    minstack.push(30);
    cout<<minstack.getMin()<<endl;
}

运行结果:

还有一种比较笨的方法是每次要push一个元素时,将元素x插入在最小栈中,但是这样需要每次将元素插入到正确的位置,因此需要排序所有的元素。

#include<iostream>
#include<stack>
using namespace std;

class MinStack {
public:
    void push(int x) {
        int tmp;
        while(!s1.empty())
        {
            tmp=top();
            if(x<=tmp)
                break;
            else
            {
                s1.pop();
                s2.push(tmp);
            }
        }
        s1.push(x);
        while(!s2.empty())
        {
            tmp=s2.top();
            s2.pop();
            s1.push(tmp);
        }
    }

    void pop() {
        if(!s1.empty())
            s1.pop();
    }

    int top() {
        if(!s1.empty())
            return s1.top();
        return 0;
    }

    int getMin() {
        if(!s1.empty())
            return s1.top();
        return 0;
    }
private:
    stack<int> s1;
    stack<int> s2;
};

int main()
{
    MinStack minstack;
    minstack.push(1);
    minstack.push(2);
    minstack.push(3);
    cout<<minstack.getMin()<<endl;
}

 

时间: 2024-10-10 04:58:29

Min Stack的相关文章

leetcode 155 Min Stack

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. • push(x) – Push element x onto stack. • pop() – Removes the element on top of the stack. • top() – Get the top element. • getMin() – Retrieve the minim

[LeetCode] Min Stack

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) – Push element x onto stack. pop() – Removes the element on top of the stack. top() – Get the top element. getMin() – Retrieve the minimum eleme

LeetCode: Min Stack 最小栈 Java

题目描述: Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top() -- Get the top element. getMin() -- Retrieve the min

UVa 10700:Camel trading

链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=113&page=show_problem&problem=1641 原题: Background Aroud 800 A.D., El Mamum, Calif of Baghdad was presented the formula 1+2*3*4+5, which had its origin in the

几个面试经典算法题Java解答

题目一: public class testClockwiseOutput {      //顺时针打印一个矩阵           @Test      public void test(){          int[][] num = new int[100][100];          int n = 4;          int count =1;                   for(int i=0;i<n;i++){              for(int j =0;j

java中equals和==的区别

[LeetCode]–155. Min Stack 在这个问题中,我遇到了==和equals的问题,虽然试一下就能得出结果,但是我想弄明白. java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的

LeetCode All in One 题目讲解汇总(持续更新中...)

终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通过OJ,或是有更好的解法,或是有任何疑问,意见和建议的话,请一定要在对应的帖子下面评论区留言告知博主啊,多谢多谢,祝大家刷得愉快,刷得精彩,刷出美好未来- 博主制作了一款iOS的应用"Leetcode Meet Me",里面有Leetcode上所有的题目,并且贴上了博主的解法,随时随地都能

剑指offer系列之十九:包含min函数的栈

题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数.要求时间复杂度是O(1). 还是先说一下思路吧,因为每次方元素进栈的时候不能保证栈顶元素都是最小的,所以需要想办法使得栈顶元素始终是最小的元素,排序是一种思路,但是每次排序还设计重新出栈和入栈,想来应该不是这样的.一种思路是可以利用一个辅助栈,相当于是以空间换时间了.具体思路是:当入栈的新元素原先栈顶元素小的话就该元素放入一个辅助栈中,如果新入栈的元素比原先栈顶元素大,则在辅助栈中继续放原先最小的元素.这样一直放下去

包含min函数的栈和两个栈实现一个队列

题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 分析:这是google的一道面试题. 看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序.这样栈顶元素将是最小元素.但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了.在栈里添加一个成员变量存放最小元素(或最小元素的位置).每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素.