实现一个栈,Push,Pop,Min,并且保证时间复杂度为O(1)

#include<iostream> 
using namespace std; 
 
struct stack   
    { 
        int* _pElem; //指向元素数据的指针 
        int _capacity;  
        int _top;    

        stack( int n )
                  :_capacity( n) 
        { 
            _top = 0; 
            _pElem = new int [_capacity]; 
        } 

        ~stack() 
        { 
            delete []_pElem; 
            _pElem = NULL; 
        }         
    };
 
class Stack  
{   
private: 
    stack s; 
    stack minstack; 

public: 
    Stack(int n)
              :s( n)
               , minstack( n) 
    {} 
 
    bool pop() 
    {   
        if (s._top == 0) 
            return false ; 
 
        size_t value = s._pElem[--s._top]; 
        //判断将要弹出的是否是最小元素 如果是 则更新最小元素栈 
        if (value == minstack._pElem[minstack._top-1]) 
            --minstack._top; 
 
        return true ; 
    } 
 
    bool push( int value ) 
    { 
        if (s._top == s._capacity) 
            return false ; 
    
        if (minstack._top==0 || value <=minstack._pElem[minstack._top-1]) 
            minstack._pElem[minstack._top++] = value; 
 
        s._pElem[s._top++] = value; 
        return true ; 
    } 
  
    int min() 
    { 
        if (minstack._top == 0) 
            return NULL ;

        int pmin = minstack._pElem[minstack._top-1];
        return pmin; 
    } 
};
时间: 2024-08-10 23:13:25

实现一个栈,Push,Pop,Min,并且保证时间复杂度为O(1)的相关文章

实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值的操作)的时间复杂度为O(1)

具体实现如下: #include<iostream> #include<stack> #include<string> #include<assert.h> using namespace std; template<class T> class Stack { public: void Push(const T& x); void Pop(); T& Min(); void PrintS(); private: stack<

011实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值,时间复杂度都为O(1)(keep it up)

实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值. push,pop和min函数的时间复杂度都为O(1). 看到这个题目最直接的反应是用一个变量来保存当前栈的最小值,让我们来看看这样可行否? 如果栈一直push那是没有问题,入栈元素如果比当前最小值还小,那就更新当前最小值. 可是如果pop掉的栈顶元素就是最小值,那么我们如何更新最小值呢?显然不太好办. 既然只用一个变量没法解决这个问题,那我们就增加变量.如果说每个结点除了保存当前的 值, 另外再保存一个从该结点到栈底的

设计一个栈,除了pop与push方法,还支持Min方法,可返回栈元素中的最小值,push、pop、min三个方法的时间复杂度必须是O(1)

1 /* 2 * 设计一个栈,除了pop与push方法,还支持Min方法,可返回栈元素中的最小值, 3 * push.pop.min三个方法的时间复杂度必须是O(1) 4 * 一种解法是在Stack类里添加一个Int型的minValue,当minValue出栈时,我们会搜索整个栈 5 * 找出最新的最小值,但是却不符合操作时间为O(1)的要求 6 * 如有: 7 * push(4)//最小值:4 8 * push(5)//最小值:4 9 * push(3)//最小值:3 10 * push(1)

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈

小结: 1. 常数时间内检索到最小元素 最小栈 - 力扣(LeetCode)https://leetcode-cn.com/problems/min-stack/ 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. getMin() -- 检索栈中的最小元素. 示例: MinStack minStack = new MinStack(); minSt

实现一个栈,并且实现一个min函数用来找当前栈中最小的元素

题目描述:实现一个栈,并且实现一个min函数用来找当前栈中最小的元素 分析:要找到栈中最小的元素,需要借助一个辅助栈,来存放当前栈中最小的元素. 入栈的时候,第一个入栈的元素,也给辅助栈入栈,此后每次入栈的元素先与辅助栈的栈顶元素比较,如果小于或等于辅助栈的栈顶元素,则同时将该元素给辅助栈入栈. 如下图所示: 出栈的时候,如果栈顶元素与辅助栈栈顶的元素相等,则同时对辅助栈进行出栈操作 如下图所示: 这样就可以保证,辅助栈中的栈顶元素始终是当前栈中最小的元素了 代码如下: #include<ios

剑指offer20:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

1 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 2. 思路和方法 利用辅助栈来存储现有栈的最小值.在入栈和出栈的时候将现有栈和最小值栈进行比较.入栈时,若新值比最小值栈的栈顶还小,则将该值同时push到最小值栈:出栈时,若现有栈的栈顶和最小值栈栈顶一致,则同时出栈,否则,仅仅现有栈pop:通过这一操作,最小值栈的栈顶将永远是现有栈元素中的最下值. 3 C++核心代码 1 class Solution { 2 public: 3

设计一个带有getmin功能的栈,保证时间复杂度在O(1)

2017-06-22  20:56:10 需要得到最小值,最简单的思路就是遍历一遍求出最小值.但是这样的时间复杂度会是O(n),不满足O(1)的要求.于是想到在建立一个栈来保存最小值. 具体操作是建立两个栈,一个存放数据,一个存放最小值. push:首先将数据压入数据栈,若最小值栈为空,则将之压入最小值栈,若最小值栈非空,则需要比较它和最小值栈的顶部数据,若小于等于,则将之压入.这里用到的思想就是,如果当前压入的数据比最小值大,那么目前数据栈的最小值就是最小值栈的栈顶元素,反之则需要将之压入:

js 的数组怎么push一个对象. Js数组的操作push,pop,shift,unshift JavaScript使用push方法添加一个元素到数组末 JavaScript数组函数unshift、shift、pop、push使用

push()函数用于向当前数组的添加一个或多个元素,并返回新的数组长度.新的元素将会依次添加到数组的末尾. 该函数属于Array对象,所有主流浏览器均支持该函数. 语法 array.push( item1 [,items... ] )参数 参数 描述item1 任意类型添加到当前数组末尾处的元素.items 可选参数/任意类型要添加到当前数组末尾处的其他项,可以有多个.注意:如果添加的元素类型为数组类型(Array),仍然会被当作一个元素看待,只是这个元素是数组类型而已.如果要合并两个数组,请使

C++算法之 两个队列实现一个栈

题目:用两个队列实现一个栈 算法思路: 现有两个队列q1与q2,入栈:如果q1与q2都为空,那么我们选择q1入栈也就是入队列,比如q1入栈 1 2 3 4 :现在要出栈,后进先出那么4要出栈.但是q1是一个 队列,先进先出,那么 1 2 3出队列 q2 1 2 3 入队列,q1中此时剩余4,把4出对列达到出栈的效果.  这个时候如果我们又加入一个元素5,那么我们应该把5放到 q1还是q2,因为现在q2中有 1 2 3,把5放到q1不方便统计,所以要把5放入到q2:如果5放到了q1,等下编写出栈的

用两个队列模拟实现一个栈的过程

栈具有"后进先出"的特点,即某个元素最后进入栈,却最先出栈:队列具有"先进先出"的特点,即元素从队尾依次进队列,依次从队头出队列:现在用两个队列模拟实现一个栈的过程,详细过程请看下面这张本人制作的gif图: 实现代码: #include <iostream> using namespace std; #include <queue> template <typename T> class Stack { public: void