public class MaxStack {
Stack<Integer> s;
int max;
/** initialize your data structure here. */
public MaxStack() {
s = new Stack<Integer>();
}
public void push(int x) {
if (s.isEmpty()) {
max = x;
}
max = Math.max(x, max);
s.push(x);
}
public int pop() {
int res = s.pop();
if (res == max && !s.isEmpty()) {
max = findMax();
}
return res;
}
public int top() {
int res = s.peek();
return res;
}
public int peekMax() {
return max;
}
public int popMax() {
Stack<Integer> temp = new Stack<Integer>();
int res = max;
while (!s.isEmpty()) {
int num = s.pop();
if (num == max) {
break;
}
temp.push(num);
}
while (!temp.isEmpty()) {
int numTemp = temp.pop();
s.push(numTemp);
}
if (!s.isEmpty()) {
max = findMax();
}
return res;
}
private int findMax() {
int res = s.peek();
Stack<Integer> sCopy = (Stack<Integer>)s.clone();
while (!sCopy.isEmpty()) {
int num = sCopy.pop();
res = Math.max(res, num);
}
return res;
}
}
官方题解1
class MaxStack {
Stack<Integer> stack;
Stack<Integer> maxStack;
public MaxStack() {
stack = new Stack();
maxStack = new Stack();
}
public void push(int x) {
int max = maxStack.isEmpty() ? x : maxStack.peek();
maxStack.push(max > x ? max : x);
stack.push(x);
}
public int pop() {
maxStack.pop();
return stack.pop();
}
public int top() {
return stack.peek();
}
public int peekMax() {
return maxStack.peek();
}
public int popMax() {
int max = peekMax();
Stack<Integer> buffer = new Stack();
while (top() != max) buffer.push(pop());
pop();
while (!buffer.isEmpty()) push(buffer.pop());
return max;
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/max-stack/solution/max-stack-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
官方题解2
class MaxStack {
TreeMap<Integer, List<Node>> map;
DoubleLinkedList dll;
public MaxStack() {
map = new TreeMap();
dll = new DoubleLinkedList();
}
public void push(int x) {
Node node = dll.add(x);
if(!map.containsKey(x))
map.put(x, new ArrayList<Node>());
map.get(x).add(node);
}
public int pop() {
int val = dll.pop();
List<Node> L = map.get(val);
L.remove(L.size() - 1);
if (L.isEmpty()) map.remove(val);
return val;
}
public int top() {
return dll.peek();
}
public int peekMax() {
return map.lastKey();
}
public int popMax() {
int max = peekMax();
List<Node> L = map.get(max);
Node node = L.remove(L.size() - 1);
dll.unlink(node);
if (L.isEmpty()) map.remove(max);
return max;
}
}
class DoubleLinkedList {
Node head, tail;
public DoubleLinkedList() {
head = new Node(0);
tail = new Node(0);
head.next = tail;
tail.prev = head;
}
public Node add(int val) {
Node x = new Node(val);
x.next = tail;
x.prev = tail.prev;
tail.prev = tail.prev.next = x;
return x;
}
public int pop() {
return unlink(tail.prev).val;
}
public int peek() {
return tail.prev.val;
}
public Node unlink(Node node) {
node.prev.next = node.next;
node.next.prev = node.prev;
return node;
}
}
class Node {
int val;
Node prev, next;
public Node(int v) {val = v;}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/max-stack/solution/max-stack-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。