设计一个具有min函数的stack

本文介绍了一种特殊的数据结构——栈,除了基本的push和pop操作外,还额外提供了查询当前栈内最小元素的功能,并确保所有操作的时间复杂度为O(1)。通过使用两个栈(一个用于存储真实数据,另一个用于记录最小值)的方法,实现了这一需求。
摘要由CSDN通过智能技术生成

此题目来自于Crack the Coding Interview 3-2

3 2  How would you design a stack which, in addition to push and pop, also has a function min which returns the minimum element? Push, pop and in should all operate in O(1) time.

思路是弄2个stack,一个realStack,存放真正的数据;另外一个是minStack,对于minStack元素中的每一个元素的意义是:push到该位置的时候,当前最小元素的值。每次push进新元素的时候,更新minStack的值;每次pop的时候,由于minStack的定义,所以只需把minStack和realStack一起进行一次pop操作就好了。

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

class StackWithMin{
public:
    void push(int value);
    void pop();
    int min();
    int top();
private:
    stack<int> realStack;
    stack<int> minStack;
};

void StackWithMin::push(int value)
{
    int currMin = 0;
    if (!minStack.empty())
        currMin = minStack.top();
    else
        currMin = INT_MAX;

    if (value < currMin)
        minStack.push(value);
    else
        minStack.push(minStack.top());

    realStack.push(value);
}

void StackWithMin::pop()
{
    if (realStack.empty() || minStack.empty())
    {
        cout<<"stack empty!"<<endl;
            return;
    }
    realStack.pop();
    minStack.pop();
}

int StackWithMin::min()
{
    if (realStack.empty() || minStack.empty())
    {
        cout<<"stack empty!"<<endl;
            return INT_MAX;
    }
    return minStack.top();
}

int StackWithMin::top()
{
    if (realStack.empty() || minStack.empty())
    {
        cout<<"stack empty!"<<endl;
            return -1;
    }

    return realStack.top();
}

int main()
{
    StackWithMin stk;
    for (int i = 0; i < 10; i++)
    {
        int value = rand()%150;
        cout<<"Pushing : "<<value<<endl;
        stk.push(value);
    }
    cout<<"Push 10 Elements and current min is : "<<stk.min()<<endl<<endl;

    for (int i = 0; i < 5; i++)
    {
        int value = stk.top();
        cout<<"Poping : "<<value<<endl;
        stk.pop();
    }
    cout<<"After pop 5 Elements, current min is : "<<stk.min()<<endl;

    return 0;
}

 

 

 

 

 

EOF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值