设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
1、栈中第一个为 当前元素为栈顶时栈中的最小数据,第二个为当前入栈元素(这个思路太妙了)
import java.util.Stack;
//栈中第一个为当前元素为栈顶时栈中的最小数据,第二个为当前入栈元素 by leetcode 用户 Hxlee
public class Test{
Stack<Integer> stack;
public Test() {
stack = new Stack<Integer>();
}
public void push(int x) {
if(stack.isEmpty()) {
stack.push(x);
stack.push(x);
}else {
int tmp = stack.peek();
stack.push(x);
if(tmp<x) {
stack.push(tmp);
}else {
stack.push(x);
}
}
}
public void pop() {
stack.pop();
stack.pop();
}
public int top() {
return stack.get(stack.size()-2);
}
public int getMin() {
return stack.peek();
}
public static void main(String[] args) {
}
}
2、使用链表,和1差不多同一个思路,即:将最小值存储起来(用链表来实现栈,next值为栈中上一个元素)
//栈中第一个为当前元素为栈顶时栈中的最小数据,第二个为实际数据 by leetcode 用户 Hxlee
public class Test{
private class Node{
int val;
int min;
Node next;
private Node(int val, int min, Node next) {
this.val = val;
this.min = min;
this.next = next;
}
}
private Node head;
public void push(int x) {
if(head == null)
head = new Node(x, x, null);
else
head = new Node(x, Math.min(x, head.min), head);
}
public void pop() {
head = head.next;
}
public int top() {
return head.val;
}
public int getMin() {
return head.min;
}
public static void main(String args[]) {
Test obj = new Test();
obj.push(1);
obj.push(3);
obj.push(5);
obj.pop();
int i = obj.top();
int j = obj.getMin();
System.out.println("the i is:::" + i + ":::the j is:::" + j);
}
}