我有两个堆栈。 我希望能够将任何元素推到一个元素上,但只有当它从另一个元素中弹出时才会出现。
而不是我当前的功能如下:
public void pushValue(int poppedValue) {
Stack.push(value)
}
我希望函数看起来像这样:
public void pushValue(pop() poppedValue) {
Stack.push(value)
}
如何将pop()
函数设置为参数,而不是int?
换句话说,如何将参数设置为仅接受从某处弹出的值?
答案 0 :(得分:2)
Java中没有办法表达这种约束。 (或任何其他语言,AFAIK)
(IMO)你能做的最好的事情就是将第二个Stack
作为参数传递给第一个参数并使第一个负责弹出一个值; e.g。
public class Stack {
...
public int transferValue(Stack source) {
int res = source.pop(); // throws exception if source is empty
this.push(value);
return res;
}
}
这会让您遇到有关push
:
您是否完全从Stack
API中删除了它?如果是这样,元素如何进入source
堆栈?
您是否将Stack API拆分为Stack
和StackWithoutPush
?如果是,那是超类/超级接口?这两种选择都不是完美的。无论哪种方式,子类在某种意义上违反了超类的契约。 (C.f. List
与UnmodifiableList
API的问题。)
答案 1 :(得分:1)
您的语法是不可能的,但可以使第二个堆栈成为成员字段,然后push
iff 当您出现该值时peek
在第二个堆栈(通过字段)。
private Stack otherStack = null; // <-- set this somehow (constructor?), or pass it.
public void pushValue(int newValue) {
if (otherStack != null && otherStack.peek() == newValue) {
Stack.push(newValue); // <-- please observe naming conventions (stack)
}
}
然后,pop()
该值。基本上,peek
,push
和然后pop
。