Q3.2 带有最小值或最大值的栈

本文介绍了一种设计思路,用于创建一个支持push、pop和查询最小元素操作都在O(1)时间复杂度内的栈实现。通过维护两个辅助栈来实现实现这一需求。

How would you design a stack which, in addition to push and pop, also has a function min which returns the minimum element? Push, pop and min should all operate in O(1) time.

 1 template<class T>
 2 class StackWithMin
 3 {
 4 public:
 5     stack()
 6     {
 7         stackTop = -1;
 8         minStackItemIndex = -1;
 9     }
10     void Push(T x)
11     {    stackTop++;
12         if(stackTop>MAXN)
13            //超出栈的最大存储量;
14         else 
15         {
16             stackItem[stackTop] = x;
17             if(x<Min())
18             {
19                 NextMinItem[stackTop] = minStackItemIndex;
20                 minStackItemIndex = stackTop;
21             }
22             else
23                 NextMinItem[stackTop] = -1;
24         }
25     }
26     void Pop()
27     {
28         if(stackTop<0)
29             ThrowException();
30         else
31         {
32             if(stackTop == minStackItemIndex)
33                 minStackItemIndex = NextMinItem[stackTop];
34             stackTop--;
35         }
36     }
37     T Top()
38     {
39         return stackItem[stackTop];
40     }
41     T Min()
42     {
43         if(minStackItemIndex>=0)
44             return stackItem[minStackItemIndex];
45         else
46             return INT_MAX;
47     }
48     
49 private:
50     T stackItem[MAXN];
51     int stackTop;
52     int NextMinItem[MAXN];
53     int minStackItemIndex;
54 
55 };

 

转载于:https://www.cnblogs.com/xuanxu/p/3240416.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值