
方法一:
- 用链表
- head中存放当前栈中的最小值,每次put时更新。
class MinStack {
class ListNode {
int val;
int min;
ListNode next;
public ListNode(int val) {
this.val = val;
}
}
ListNode head;
public MinStack() {
head = null;
}
public void push(int val) {
ListNode newNode = new ListNode(val);
if (head == null) {
newNode.min = val;
} else {
newNode.min = newNode.val < head.min ? newNode.val : head.min;
}
newNode.next = head;
head = newNode;
}
public void pop() {
head = head.next;
}
public int top() {
return head.val;
}
public int getMin() {
return head.min;
}
}
方法二: 双栈
- stack记录正常元素
- minstack对应顺序的元素和stack对齐,记录stack中当前位置上的元素该返回的min
class MinStack {
Stack<Integer> stack;
Stack<Integer> minStack;
public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int val) {
stack.push(val);
if (minStack.size() == 0 || val < minStack.peek()) {
minStack.push(val);
} else {
minStack.push(minStack.peek());
}
}
public void pop() {
stack.pop();
minStack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}