题目链接: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(); } } }