包含min函数的栈——21

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push、及pop的时间复杂度都是O(1)。

首先,栈的特点是“先进后出,后进先出”,因此,对于pop和push两个操作自然都是直接放入栈顶和直接在栈顶删除元素,那么如果要找栈中的最小值min,因为要求时间复杂度为O(1),因此肯定不能遍历栈找出最小元素,这里可以想到使用在这个栈的数据结构中使用两个栈,一个栈用来正常的存放删除数据,另一个栈就用来存放当前栈中的最小值;

当第一次push进栈的时候,就将数据也push进min栈中,并且min栈中的栈顶元素为当前栈的最小值,当push的数据比min栈中的栈顶元素小的时候,就将push的数据也放进min栈中,当push的数据比min栈中的栈顶元素大的时候,就在再次将min栈中的栈顶元素再压进栈,因此,这样下去,min栈中栈顶元素始终为当前数据栈的最小值;而进行pop数据的时候,在pop数据栈的栈顶元素时也pop出min栈的栈顶元素,这样的话还是保证了min栈中栈顶元素为最小值,且时间复杂度为O(1);

上述内容可画图如下:

程序设计如下:

#include <iostream>
#include <stdlib.h>
using namespace std;

template <class T>
class my_stack
{
public:
    my_stack()//栈的默认构造函数,开始时指针为空且将容量设计为3
        :_data(NULL)
        ,_min(NULL)
        ,_size(0)
        ,_capacity(3)
    {}  

    void my_push(T data)//push数据
    {   
        if(_data == NULL)//当第一次放数据时
        {
            _data = new T[_capacity];
            _min = new T[_capacity];
            _data[_size] = data;
            _min[_size++] = data;
            return;
        }
     
        _CheckCapacity();//检查容量
        _data[_size] = data;
        if(data < _min[_size-1])//若果要放入的数据比栈顶元素小,直接放入,否则,再次放入栈顶元素
            _min[_size] = data;
        else
            _min[_size] = _min[_size-1];

        ++_size;
    }

    void my_pop()//pop数据
    {
        if(_data == NULL)
            return;

        --_size;
    }

    T& min()//取出最小值
    {
        if(_data == NULL)
        {
            cout<<"no data..."<<endl;
            exit(0);
        }

        return _min[_size-1];
    }

    ~my_stack()//析构函数
    {
        if(_data != NULL)
        {
            delete[] _data;
            delete[] _min;
            _data = NULL;
            _min = NULL;
            _size = 0;
        }
    }

    void print_stack()//打印栈元素
    {
       if(_data != NULL)
        {
            for(int i = 0; i < _size; ++i)
            {
                cout<<_data[i]<<" ";
            }
            cout<<endl;
        }
    }

private:
    void _CheckCapacity()//容量检查
    {
        if((_size+1) <= _capacity)
        {
            _capacity *= 2;
            T *tmp_data = new T[_capacity];
            T *tmp_min = new T[_capacity];
            for(int i = 0; i < _size; ++i)
            {
                tmp_data[i] = _data[i];
                tmp_min[i] = _min[i];
            }
            swap(_data, tmp_data);
            swap(_min, tmp_min);

            delete[] tmp_data;
            delete[] tmp_min;
        }
    }

private:
    T *_data;
    T *_min;
    size_t _size;
    size_t _capacity;
};

int main()
{
    my_stack<int> stack;
    stack.my_push(3);
    stack.my_push(5);
    stack.my_push(1);
    stack.my_push(2);
    stack.my_push(0);
    stack.my_push(6);
    stack.print_stack();

    cout<<"min data: "<<stack.min()<<endl;

    stack.my_pop();
    cout<<"min data: "<<stack.min()<<endl;
    stack.my_pop();
    cout<<"min data: "<<stack.min()<<endl;
    stack.my_pop();
    cout<<"min data: "<<stack.min()<<endl;
    stack.my_pop();
    cout<<"min data: "<<stack.min()<<endl;

    return 0;
}

运行程序:

可以看到,每pop一次数据,都能输出当前栈中的最小值,且时间复杂度都为O(1)。

《完》

时间: 2024-11-05 15:47:08

包含min函数的栈——21的相关文章

【编程题目】设计包含 min 函数的栈

2.设计包含 min 函数的栈(栈)定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素.要求函数 min.push 以及 pop 的时间复杂度都是 O(1). 我的思路: 用一个额外的元素记录最小值,push时若遇到更小的则更新.但是pop的时候遇到了问题,最小的弹出去了怎么得到下一个最小的值? 总觉得要排序,再存一个min的链.结果没达到O(1). /* 2.设计包含 min 函数的栈(栈) 定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素. 要求函数 min

包含min函数的栈-剑指Offer

包含min函数的栈 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数 思路 使用一个辅助栈,跟踪原始栈中每个元素在栈口时的该栈的最小值 代码 import java.util.Stack; public class Solution { Stack<Integer> s_data = new Stack(); Stack<Integer> s_min = new Stack(); public void push(int node) { s_data.

微软100题系列之-----设计包含min函数的栈

题意: 定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素. 要求函数min.push 以及pop 的时间复杂度都是O(1). 思路:定义两个栈,一个用来记录数据的插入和删除,一个用来存储最小值的变化 代码如下: template <class T> class Stack { public: Stack(int len=100); T Min(); T Pop(); void Push(T val); private: T top1,top2; T *stack1,*stack

剑指offer系列源码-包含min函数的栈

题目1522:包含min函数的栈 时间限制:1 秒内存限制:128 兆特殊判题:否提交:1495解决:476 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为一个整数n(1<=n<=1000000), n代表将要输入的操作的步骤数. 接下来有n行,每行开始有一个字母Ci. Ci='s'时,接下有一个数字k,代表将k压入栈. Ci='o'时,弹出栈顶元素. 输出: 对应每个测

2.设计包含 min 函数的栈

http://zhedahht.blog.163.com/blog/static/25411174200712895228171/ http://blog.csdn.net/anchor89/article/details/6055412 http://blog.csdn.net/sgbfblog/article/details/7752878 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 解法一: 使用一个辅助栈来

包含min函数的栈 + 栈的压入、弹出序列

剑指offer 两道关于 数据结构——栈 的题目 1. 包含min函数的栈 简要分析一下这道题,这道题做了3遍才过,踩了一些小坑 看看示例: 得到了规律,那么关键部分的代码实现,就在于 两个栈(rawStack 和 minStack) 和 push() 方法 Stack<Integer> rawStack = new Stack<>(); Stack<Integer> minStack = new Stack<>(); public void push1(i

剑指Offer对答如流系列 - 包含min函数的栈

面试题30:包含min函数的栈 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 问题分析 push 和 pop均容易实现. 主要就是min函数的定义,如果要通过操作push和pop操作获取最小元素时间复杂度为O(1),基本上是不可能的. 如果我们另外定义一个成员变量 专门存储最小元素的值,但是当最小元素弹出后,min就需要相应改变,所以必须把每次的最小值都存储下来.这个时候不得不考虑采用一个辅助栈

【剑指offer】【栈】30.包含min函数的栈

包含min函数的栈 维护两个栈:栈st存储所有元素,minSt是一个单调栈,栈顶元素为min 1. 入栈:st.push(x); 若minSt.top >= x或minSt为空,x入栈minSt 2. 出栈:若minSt与st栈顶元素相同,则二者都出栈,否则st出栈 3. 获取最小值:若minSt不为空,返回minSt栈顶元素 class MinStack { public: stack<int> st; stack<int> minSt; /** initialize yo

剑指offer 21:包含min函数的栈

题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 解题思路 要求在O(1)时间内完成,由于栈后进先出的原则,不能出现破坏栈结构的事情.因而采用以空间换时间的思路,建立辅助栈,辅助栈与数据栈的出入栈操作同步进行,区别在于数据栈压入当前元素,辅助栈压入当前情况下的最小元素,于是,需要定义一个临时变量来记录上一时刻的最小元素,并与当前元素比较,记录当前情况下的最小元素.出栈时,两个栈同步操作. C++代码实现: class Solutio