-
Notifications
You must be signed in to change notification settings - Fork 97
/
Copy pathMaxStack716.java
94 lines (78 loc) · 2.31 KB
/
MaxStack716.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/**
* Design a max stack that supports push, pop, top, peekMax and popMax.
*
* push(x) -- Push element x onto stack.
* pop() -- Remove the element on top of the stack and return it.
* top() -- Get the element on the top.
* peekMax() -- Retrieve the maximum element in the stack.
* popMax() -- Retrieve the maximum element in the stack, and remove it. If you
* find more than one maximum elements, only remove the top-most one.
*
* Example 1:
* MaxStack stack = new MaxStack();
* stack.push(5);
* stack.push(1);
* stack.push(5);
* stack.top(); -> 5
* stack.popMax(); -> 5
* stack.top(); -> 1
* stack.peekMax(); -> 5
* stack.pop(); -> 1
* stack.top(); -> 5
*
* Note:
* -1e7 <= x <= 1e7
* Number of operations won't exceed 10000.
* The last four operations won't be called when stack is empty.
*/
public class MaxStack716 {
class MaxStack {
private Stack<Element> stack;
/** initialize your data structure here. */
public MaxStack() {
this.stack = new Stack<>();
}
public void push(int x) {
int max = this.stack.isEmpty() ? x : Math.max(x, this.peekMax());
this.stack.push(new Element(x, max));
}
public int pop() {
return this.stack.pop().val;
}
public int top() {
return this.stack.peek().val;
}
public int peekMax() {
return this.stack.peek().max;
}
public int popMax() {
int max = this.peekMax();
Stack<Integer> temp = new Stack<>();
while (this.top() != max) {
temp.push(this.pop());
}
this.pop();
while (!temp.isEmpty()) {
this.push(temp.pop());
}
return max;
}
class Element {
int val;
int max;
public Element(int val, int max) {
this.val = val;
this.max = max;
}
}
}
/**
* Your MaxStack object will be instantiated and called as such:
* MaxStack obj = new MaxStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.peekMax();
* int param_5 = obj.popMax();
*/
}