码迷,mamicode.com
首页 > 其他好文 > 详细

设计一个带有getmin功能的栈,保证时间复杂度在O(1)

时间:2017-06-22 21:45:21      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:blog   一个栈   oid   遍历   bsp   pre   empty   style   min()   

2017-06-22  20:56:10

需要得到最小值,最简单的思路就是遍历一遍求出最小值。但是这样的时间复杂度会是O(n),不满足O(1)的要求。于是想到在建立一个栈来保存最小值。

具体操作是建立两个栈,一个存放数据,一个存放最小值。

push:首先将数据压入数据栈,若最小值栈为空,则将之压入最小值栈,若最小值栈非空,则需要比较它和最小值栈的顶部数据,若小于等于,则将之压入。这里用到的思想就是,如果当前压入的数据比最小值大,那么目前数据栈的最小值就是最小值栈的栈顶元素,反之则需要将之压入;

pop:将数据栈的元素弹出时需要比较他和最小值栈的栈顶元素大小,若等于的话,也需要将最小值栈的栈顶元素pop出来;

getmin:只需要将最小值栈的栈顶元素返回即可

 

 1 class Mystack
 2 {
 3     stack<int> s1;
 4     stack<int> mins;
 5 
 6 public:
 7     void pop()
 8     {
 9         if(s1.empty()) {cout<<"栈空\n"; return;}
10         else
11         {
12             int temp = s1.top();
13             if(temp == mins.top()){mins.pop();}
14             s1.pop();
15         }
16     }
17 
18     void push(int key)
19     {
20         if(mins.empty()) {mins.push(key);cout<<"mins "<<key<<endl;s1.push(key);}
21         else
22         {
23             if(mins.top() >= key) {mins.push(key);cout<<"mins "<<key<<endl;}
24             s1.push(key);
25         }
26     }
27 
28     void getmin()
29     {
30         if(mins.empty()) {cout<<"当前栈为空\n";}
31         else cout<<mins.top()<<endl;
32     }
33 };

设计一个带有getmin功能的栈,保证时间复杂度在O(1)

标签:blog   一个栈   oid   遍历   bsp   pre   empty   style   min()   

原文地址:http://www.cnblogs.com/TIMHY/p/7067173.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!