包含min函数的栈(剑指offer+新概念题)模拟

包含min函数的栈
  • 参与人数:1489时间限制:1秒空间限制:32768K
  • 通过比例:32.05%
  • 最佳记录:0 ms|0K(来自  冰封七大洲)

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

题目链接:http://www.nowcoder.com/practice/4c776177d2c04c2494f2555c9fcc1e49?rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

 

我觉得这一类型的题,最关键的是,搞清楚题目要我们怎么去实现函数,对于这种模拟题,题意的理解和思路一样重要,我一开始就没看懂。

面试的时候不清楚的题目意思,一定要问清楚才可以! 这题的意思是这个min栈可以输出当前栈内元素的最小值,那么我一开始想到的是优先队列(那个时候题目没理解),然后发现错了,后来想到用双栈来存!

一个存原始的栈 yuan;另一个存当前栈内最小的元素,保证两个栈的大小相等,那么当一个pop()的时候,另一个栈也同样pop();

 

测试样例:6 3 2 1 1 1 1

                  6 6 8 4 2 3 3

 

#include<stdio.h>
#include<stack>
using namespace std;
class Solution {
public:
    stack<int> yuan;
    stack<int> y_min;
    void push(int value) {
        if(y_min.empty()) y_min.push(value);
        else
        {
            int tmp=y_min.top();
            if(tmp>=value) y_min.push(value);
            else y_min.push(tmp);
        }
        yuan.push(value);
    }
    void pop() {
        if(!yuan.empty())yuan.pop();
        if(!y_min.empty())y_min.pop();
    }
    int top() {
        if(!yuan.empty())return yuan.top();
    }
    int min() {
        if(!y_min.empty())return y_min.top();
    }
};

int main()
{
    int n;
    Solution so;
    while(scanf("%d",&n)!=EOF)
    {

        for(int i=0;i<n;i++)
        {
            int tt;
            scanf("%d",&tt);
            so.push(tt);
        }
        for(int i=0;i<n;i++)
        {
            printf("%d\n",so.min());
            so.pop();
        }
    }
}

你可能感兴趣的:(栈,剑指offer,min栈)