左神算法书籍《程序员代码面试指南》——1_01设计一个有getMin功能的栈

【题目】

实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

【要求】

1.pop、push、getMin操作的时间复杂度都是O(1)。
2.设计的栈类型可以使用现成的栈结构。

【题解】


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


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

 1 #pragma once
 2 #include <iostream>
 3 #include <stack>
 4 
 5 using namespace std;
 6 
 7 //
 8 //实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
 9 //【要求】
10 //1.pop、push、getMin操作的时间复杂度都是O(1)。
11 //2.设计的栈类型可以使用现成的栈结构。
12 //
13 //
14 //解题思路:
15 //    使用一个辅助栈,里面存的目前栈中的最小值
16 
17 
18 class GetMin
19 {
20 public:
21     void PushData(int a)
22     {
23         Data.push(a);
24         if (Min.empty())
25             Min.push(a);//当还未存数时,目前栈中的最小值就是第一个数
26         else
27             Min.push(Min.top() <= a ? Min.top() : a);
28         //将新加入的数与栈中的最小值相比,存入新的最小值,以维持Data与Min栈的高度一样
29     }
30 
31     int GetTop()
32     {
33         if (Data.size())
34             return Data.top();
35         return -1;
36     }
37 
38     int theMin()
39     {
40         if (Data.size())
41             return Min.top();
42         return -1;
43     }
44 
45     void PopData()
46     {
47         if (Data.size())
48         {
49             Data.pop();
50             Min.pop();
51         }
52     }
53 
54 private:
55     stack<int>Data;
56     stack<int>Min;
57 };
58 
59 void main()
60 {
61     GetMin ss;
62     ss.PushData(6);
63     cout << ss.theMin() << endl;
64     ss.PushData(5);
65     cout << ss.theMin() << endl;
66     ss.PushData(2);
67     cout << ss.theMin() << endl;
68     ss.PushData(1);
69     cout << ss.theMin() << endl;
70     ss.PushData(3);
71     cout << ss.theMin() << endl;
72     ss.PushData(6);
73     cout << ss.theMin() << endl;
74 
75     ss.PopData();
76     cout << ss.theMin() << endl;
77     ss.PopData();
78     cout << ss.theMin() << endl;
79     ss.PopData();
80     cout << ss.theMin() << endl;
81     ss.PopData();
82     cout << ss.theMin() << endl;
83 }

 

转载于:https://www.cnblogs.com/zzw1024/p/11170332.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值