题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
/**
* 包含min函数的栈
*/
static class StackNode {
int value;
Solution.StackNode next;
}
private int[] stack = new int[0];
private Solution.StackNode minStackNode;//记录的是最小值的链表
private int length = 0;
public void push(int node) {
int[] stackcopy = new int[length + 1];
System.arraycopy(stack, 0, stackcopy, 0, length);
if (length == 0) {
//长度为0是添加的节点自然是最小节点
minStackNode = new Solution.StackNode();
minStackNode.value = node;
} else if (minStackNode.value >= node) {
//长度不为0,在链表最前面插入当前节点
Solution.StackNode stackNode = new Solution.StackNode();
stackNode.value = node;
stackNode.next = minStackNode;
minStackNode = stackNode;
}
stack = stackcopy;
stack[length] = node;
length++;
}
//这里如果pop出了最小的数,那么就不知道pop了之后最小数是哪个了。所以需要单向链表结构来存储这种关系
public void pop() {
if (length == 0) {
return;
}
int[] stackcopy = new int[length - 1];
System.arraycopy(stack, 0, stackcopy, 0, length - 1);
//如果是最小值
if (stack[length - 1] == minStackNode.value) {
//如果是最小值,则移向下一个节点
if (minStackNode.next == null) {
minStackNode = null;
} else {
minStackNode = minStackNode.next;
}
}
stack = stackcopy;
length--;
}
public int top() {
if (length == 0) {
return 0;
}
return stack[0];
}
public int min() {
if (minStackNode == null) {
return 0;
}
return minStackNode.value;
}
/** 结束*/