剑指 Offer 30. 包含min函数的栈
题目:
思路:
无论使用哪种数据结构,最重要的就是每次push,都对应一个min,这样pop的时候就不会有问题。
解答:
双栈
class MinStack {
/**
* initialize your data structure here.
*/
private Stack<Integer> stack;
private Stack<Integer> minStack;
public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
stack.push(x);
if (minStack.isEmpty() || x < minStack.peek()) {
minStack.push(x);
return;
}else{
minStack.push(minStack.peek());
}
/* do {
tempStack.push(minStack.pop());
} while (x > minStack.peek());
minStack.push(x);
minStack.push(tempStack.pop());*/
}
public void pop() {
stack.pop();
minStack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return minStack.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/
手写链表:
class MinStack {
/**
* initialize your data structure here.
*/
private Node head;
public MinStack() {
}
public void push(int x) {
if (head == null) {
head = new Node(x, x, null);
return;
}
if (head.min > x) {
head = new Node(x, x, head);
} else {
head = new Node(x, head.min, head);
}
}
public void pop() {
head = head.next;
}
public int top() {
return head.val;
}
public int min() {
return head.min;
}
}
class Node {
int val;
int min;
Node next;
public Node() {
}
public Node(int val, int min, Node node) {
this.val = val;
this.min = min;
this.next = node;
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/