包含min函数的栈

题目:

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。


提示:

    各函数的调用总次数不超过 20000 次

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

 1 import java.util.*;
 2 
 3 /**
 4  * @author 不乏理想的三师弟
 5  * 
 6     曾想过通过红黑树去实现 π_π ,下面代码也可以将ArrayList换成Stack对象作为存储对象。
 7     
 8     考虑到的问题:
 9     1、当最小元素出栈时,次小元素是什么?
10     手段:
11     在每次压栈操作时,都找出此时栈中的最小元素,若该最小元素不在B栈顶则额外压入B栈。
12     (即需执行压栈的元素与B栈顶作比较,若比B栈顶元素小则额外压入B栈)
13     在每次弹栈时,若该弹栈元素==B栈顶元素,则B栈同时进行一次弹栈。
14 
15  */
16 public class MinStack {
17     private ArrayList<Integer> stackA;
18     private ArrayList<Integer> stackB;
19     
20     private int indexA;
21     private int indexB;
22     
23     public MinStack() {
24         stackA = new ArrayList<>();
25         stackB = new ArrayList<>();
26         indexA = -1;
27         indexB = -1;
28     }
29     
30     // 压栈 (A栈)
31     public void push(int x) {
32         // 如果x元素是当前栈中最小元素,则额外压入B栈
33         //注意 是<=,因为在弹栈时是通过判断弹栈元素与B栈顶元素是否相等的而决定B是否弹栈(存在多个相同的当前最小元素的可能)
34         if(x <= min()) {
35             pushB(x);
36         }
37         stackA.add(x);
38         indexA++;
39     }
40     
41     // 弹栈(A栈)
42     public void pop() {
43         if(indexA == -1) return;
44         // 若该弹栈元素==B栈顶元素,则B栈同时进行一次弹栈。
45         if(stackA.remove(indexA--) == min()) {
46             popB();
47         }
48     }
49     
50     //获取栈顶元素(A栈)
51     public int top() {
52         if(indexA == -1) return 0;
53         return stackA.get(indexA);
54     }
55     
56     //获取当前栈中最小元素(获取B栈顶元素)
57     public int min() {
58         // 目的是为了将入栈的第一个元素也压入B栈
59         if(indexB == -1) return Integer.MAX_VALUE;
60         return stackB.get(indexB);
61     }
62     
63     //B栈辅助方法
64     public void popB() {
65         if(indexB == -1) return;
66         stackB.remove(indexB--);
67     }
68     public void pushB(int x) {
69         stackB.add(x);
70         indexB++;
71     }
72 }

 

包含min函数的栈

上一篇:Vue CLI | 安装


下一篇:MyEclipse从目录里移除所有项目