Я работаю через книгу CTCI и нашел этот ответ непонятным. Цель состоит в том, чтобы создать структуру данных стека, которая может выдвигать, выталкивать и минировать (получить минимальный элемент в стеке) в O (1). Я закодировал класс, который имеет два стека, один для хранения минимумов, а другой работает как обычный стек. Код ниже. Это работает, насколько мне известно из тестирования.
public static class StackWithMin extends Stack<Integer>{
Stack<Integer> stack;
Stack<Integer> minStack;
public StackWithMin(){
stack = new Stack<Integer>();
minStack = new Stack<Integer>();
}
public void push(int value){
if(value <= min()){
minStack.push(value);
}
stack.push(value);
}
public Integer pop(){
int value = stack.pop();
if(value == min()){
minStack.pop();
}
return value;
}
public int min(){
if(minStack.isEmpty()){
return Integer.MAX_VALUE;
}
return minStack.peek();
}
}
Однако ответ, приведенный в книге, мне не совсем понятен. Я прошел два курса по Java, но последние два провел на C, поэтому мои концепции ООП немного устарели. Класс имеет только одно поле стека и использует супер вызов для обновления «обычного» стека и вызов s2 для обновления минимального стека. Глядя на это в Java, визуализатор показывает только один объект стека, который, очевидно, хранит два разных стека. Эта реализация работает, но я не уверен, почему именно. Разъяснение будет оценено!
public class Q2 /* MinStack */ extends Stack<Integer> {
private Stack<Integer> min = new Stack<Integer>();
public void push(int item) {
if (min.isEmpty() || item < min()) {
min.push(item);
}
super.push(item);
}
public Integer pop() {
int item = super.pop();
if (item == min()) {
min.pop();
}
return item;
}
public Integer min() {
return min.peek();
}