我有两个堆栈。我希望能够将任何元素推送到一个元素上,但前提是它是从另一个元素上弹出的。
而不是我当前的函数,如下所示:
public void pushValue(int poppedValue) {
Stack.push(value)
}
我希望函数看起来像这样:
public void pushValue(pop() poppedValue) {
Stack.push(value)
}
如何将pop()
函数设置为参数,而不是整型?换句话说,我如何将参数设置为只接受从某处弹出的值?
发布于 2017-02-11 10:49:41
在Java中没有方法来表达这种约束。(或任何其他语言的AFAIK)
(IMO)最多只能将第二个Stack
作为参数传递给第一个参数,并让第一个参数负责弹出一个值;
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
应用编程接口中完全删除?如果是,元素是如何进入source
堆栈的?Stack
和StackWithoutPush
?如果是,哪个是超类/超接口?这两种选择都不是完美的。无论哪种方式,子类在某种意义上都违反了超类的约定。(C.f.List
与UnmodifiableList
API的问题。)发布于 2017-02-11 10:42:01
您的语法是不可能的,但是您可以使第二个堆栈成为成员字段,然后当您在第二个堆栈(通过该字段)执行peek
操作时,push
该值就会出现。
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
。
https://stackoverflow.com/questions/42171539
复制相似问题