求栈中数据的最小值

题目描述:
  实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
  【要求】
  1.pop、push、getMin操作的时间复杂度都是O(1)。
  2.设计的栈类型可以使用现成的栈结构。


解题思路:
  使用一个辅助栈,里面存的目前栈中的最小值

代码实现:  

  

 1 class GetMin
 2 {
 3 public:
 4     void PushData(int a)
 5     {
 6         Data.push(a);
 7         if (Min.empty())
 8             Min.push(a);//当还未存数时,目前栈中的最小值就是第一个数
 9         else
10             Min.push(Min.top() <= a ? Min.top() : a);
11         //将新加入的数与栈中的最小值相比,存入新的最小值,以维持Data与Min栈的高度一样
12     }
13 
14     int GetTop()
15     {
16         if(Data.size())
17             return Data.top();
18         return -1;
19     }
20 
21     int theMin()
22     {
23         if (Data.size())
24             return Min.top();
25         return -1;
26     }
27 
28     void PopData()
29     {
30         if (Data.size())
31         {
32             Data.pop();
33             Min.pop();
34         }
35     }
36 
37 private:
38     stack<int>Data;
39     stack<int>Min;
40 };
41 
42 void Test()
43 {
44     GetMin ss;
45     ss.PushData(6);
46     cout << ss.theMin() << endl;
47     ss.PushData(5);
48     cout << ss.theMin() << endl;
49     ss.PushData(2);
50     cout << ss.theMin() << endl;
51     ss.PushData(1);
52     cout << ss.theMin() << endl;
53     ss.PushData(3);
54     cout << ss.theMin() << endl;
55     ss.PushData(6);
56     cout << ss.theMin() << endl;
57 
58     ss.PopData(); 
59     cout << ss.theMin() << endl;
60     ss.PopData();
61     cout << ss.theMin() << endl;
62     ss.PopData();
63     cout << ss.theMin() << endl;
64     ss.PopData();
65     cout << ss.theMin() << endl;
66 
67 }

猜你喜欢

转载自www.cnblogs.com/zzw1024/p/10988060.html
今日推荐