Я работаю над вопросом практического интервью. Проблема состоит в том, чтобы реализовать отсортированный стек, используя только еще один стек для временного хранения.Наследование Java, как переопределить метод в подклассе
Описание реализации: Я расширяю класс Stack для реализации класса SortedStack. Большинство методов класса SortedStack идентичны классу Stack, поэтому мне не нужно их реализовывать. Только метод push отменяется.
В моей реализации я передаю текущий стек, чтобы нажать метод. Мой вопрос: это лучший способ получить доступ к существующему стеку. Могу ли я получить содержимое стека, не передавая его методу push()?
Node.java
public class Node {
private int key;
private float value;
public Node(int key, float value) {
this.key = key;
this.value = value;
}
public int getKey() { return key; }
public void setKey(int key) { this.key = key; }
public float getValue() { return value; }
public void setValue(float value) { this.value = value; }
}
SortedStack.java
import java.util.Stack;
public class SortedStack extends Stack {
public SortedStack() {
super();
}
public void push(Stack<Node> mainStack, Node newNode) {
Stack<Node> tempStack = new Stack<Node>();
while (!mainStack.isEmpty()) {
if (mainStack.peek().getKey() > newNode.getKey()) {
tempStack.push(mainStack.pop());
}
else {
break;
}
}
mainStack.push(newNode);
while (!tempStack.isEmpty()) {
mainStack.push(tempStack.pop());
}
}
}
SortedStackApp.java
public class SortedStackApp {
public static void main(String[] args) {
SortedStack stack = new SortedStack();
stack.push(stack, new Node(10, 1.1f));
stack.push(stack, new Node(80, 1.8f));
stack.push(stack, new Node(50, 1.5f));
stack.push(stack, new Node(90, 1.9f));
stack.push(stack, new Node(20, 1.2f));
stack.push(stack, new Node(30, 1.3f));
Node node = null;
while (!stack.isEmpty()) {
node = (Node) stack.pop();
System.out.printf("(%d, %3.1f) ", node.getKey(), node.getValue());
}
System.out.println();
}
}
Stack я s java.util.Stack, как описано в: http://docs.oracle.com/javase/7/docs/api/java/util/Stack.html
Это не очень хорошая реализация, потому что вы перегружаете ** 'push()', а не переопределяете ее. Пользователь, использующий ваш стек, по-прежнему будет использовать «push» с одним параметром. Проверьте перегрузку и переопределение. – RealSkeptic
Я бы выбрал SortedStack ** использовать ** a Stack. Да, вам нужно создать все методы из Stack, но у вас есть доступ ко всему стеку, а также модификация метода push, как вы пожелаете. –
@RealSkeptic, согласованное переопределение лучше, чем перегрузка. Тем более, что я использую все остальные методы из Stack без изменений. Ваш комментарий помог лучше перефразировать мой вопрос. Мой первоначальный вопрос перефразирован: могу ли я получить содержимое стека, не передавая его методу push(). – rcode74