实现一个具有GetMin功能的栈

题目:

实现一个栈,要求实现push(出栈)、pop(入栈)、getMin(返回最小值)的时间复杂度为O(1)

基本思路:

(1)建立两个栈,一个栈用于存储原始数据originalStack,另一个用于存储最小值数据minStack
(2)压入数据时,originalStack直接压入数据value
   对于minStack有两种实现方法
方法一:
   每次都压入原始数据栈中的最小值,该方法minStack压入费空间,弹出省时间
方法二
   原始栈中若有更小值出现则压入minStack,否则不做操作,该方法minStack压入省空间,弹出费时间

代码实现

方法一:

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

template <typename T>
class GetMinstack
{
private:
    stack<T> originalStack; //存储原本数据
    stack<T> minStack;      //存储最小值数据

public:
    void push(T value)
    {
        originalStack.push(value);
        if (minStack.empty()) //最小栈也为空,则直接将值压入栈中
        {
            minStack.push(value);
        }
        else
        {
            if (value <= minStack.top())
            {
                minStack.push(value);
            }
            else
            {
                minStack.push(minStack.top());
            }
        }
    }

    void pop()
    {
        originalStack.pop();
        minStack.pop();
    }

    T getMin()
    {
        if (minStack.empty())
        {
            cout << " 最小栈为空! " << endl;
            return 0;
        }
        return minStack.top();
    }

    stack<T> getOriginalStack()
    {
        return originalStack;
    }

    stack<T> getMinStack()
    {
        return minStack;
    }
};

template <typename T>
void toString(stack<T> s)
{
    int len = s.size();
    cout << "[";
    for (int i = 0; i < len; i++)
    {
        if (i != len - 1)
        {
            cout << s.top() << ", ";
            s.pop();
        }
        else
        {
            cout << s.top() << "]" << endl;
            s.pop();
        }
    }
}

int main()
{
    GetMinstack<double> s;
    string flag;
    while (true)
    {
        cout << "请输入您要存入的数字(输入'quit'结束):";
        cin >> flag;
        if (flag == "quit")
            break;

        double num = atof(flag.c_str());
        s.push(num);

        cout << "存入数字结果展示:" << endl;
        cout << "数据栈:";
        toString(s.getOriginalStack());
        cout << "最小栈:";
        toString(s.getMinStack());
        cout << "数据栈最小值:" << s.getMin() << endl;
        cout << endl;
    }
    return 0;
}

方法二:

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

template <typename T>
class GetMinstack
{
private:
    stack<T> originalStack; //存储原本数据
    stack<T> minStack;      //存储最小值数据

public:
    void push(T value)
    {
        originalStack.push(value);
        if (minStack.empty()) //最小栈也为空,则直接将值压入栈中
        {
            minStack.push(value);
        }
        else
        {
            if (value < minStack.top())
            {
                minStack.push(value);
            }
        }
    }

    void pop()
    {
        if (originalStack.top() == minStack.top())
            minStack.pop();
        originalStack.pop();
    }

    T getMin()
    {
        if (minStack.empty())
        {
            cout << " 最小栈为空! " << endl;
            return 0;
        }
        return minStack.top();
    }

    stack<T> getOriginalStack()
    {
        return originalStack;
    }

    stack<T> getMinStack()
    {
        return minStack;
    }
};

template <typename T>
void toString(stack<T> s)
{
    int len = s.size();
    cout << "[";
    for (int i = 0; i < len; i++)
    {
        if (i != len - 1)
        {
            cout << s.top() << ", ";
            s.pop();
        }
        else
        {
            cout << s.top() << "]" << endl;
            s.pop();
        }
    }
}

int main()
{
    GetMinstack<double> s;
    string flag;
    while (true)
    {
        cout << "请输入您要存入的数字(输入'quit'结束):";
        cin >> flag;
        if (flag == "quit")
            break;

        double num = atof(flag.c_str());
        s.push(num);

        cout << "存入数字结果展示:" << endl;
        cout << "数据栈:";
        toString(s.getOriginalStack());
        cout << "最小栈:";
        toString(s.getMinStack());
        cout << "数据栈最小值:" << s.getMin() << endl;
        cout << endl;
    }
    return 0;
}

这里还发现了一个以前一直不知道的地方,当函数的参数是栈的时候,该种传参方式竟然是值传递

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值