在Java中,如何将Stack.pop()作为参数强制执行?

在Java中,如何将Stack.pop()作为参数强制执行?,java,stack,Java,Stack,我有两层。 我希望能够将任何元素推到其中一个元素上,但前提是它从另一个元素上弹出 而不是我当前的函数如下所示: public void pushValue(int poppedValue) { Stack.push(value) } 我希望函数看起来像这样: public void pushValue(pop() poppedValue) { Stack.push(value) } 如何将pop()函数设置为参数,而不是int? 换句话说,我如何设置参数以仅接受从某处弹出的值?您的语

我有两层。 我希望能够将任何元素推到其中一个元素上,但前提是它从另一个元素上弹出

而不是我当前的函数如下所示:

public void pushValue(int poppedValue) {
  Stack.push(value)
}
我希望函数看起来像这样:

public void pushValue(pop() poppedValue) {
  Stack.push(value)
}
如何将
pop()
函数设置为参数,而不是int?
换句话说,我如何设置参数以仅接受从某处弹出的值?

您的语法不可能,但您可以将第二个堆栈设置为成员字段,然后
推送
iff当您
查看第二个堆栈(通过字段)时,该值存在


private Stack otherStack=null;// Java中没有办法表达这种约束。(或使用任何其他语言,AFAIK)

(IMO)您所能做的最好的事情是将第二个
堆栈作为参数传递给第一个堆栈,并让第一个堆栈负责弹出一个值;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;
    }
}
这会给您带来有关推送的问题:

  • 您是否将其完全从
    堆栈
    API中删除?如果是这样,元素如何进入
    堆栈

  • 是否将堆栈API拆分为
    堆栈
    堆栈外推
    ?如果是,哪个是超级类/超级接口?两种选择都不是完美的。无论如何,子类在某种意义上违反了超类的约定。(C.f.
    List
    UnmodifiableList
    api的问题。)


只需传递第一个堆栈,这样方法就可以处理弹出值并将其推送到第二个堆栈上。您可以将堆栈本身传递给方法,让它弹出值(尽管这可能会导致一些设计问题),但无法保证
int
将具有特定的“历史”.你的意思是说你想要一个从一个堆栈中弹出一个值并将其放到另一个堆栈中的单一操作吗?或者你想要一个只接受过去某个时候从另一个堆栈中删除的值的堆栈?@DaveCosta我想要函数本身从堆栈中弹出该值并立即使用它。类似于
push(这个函数实际上刚刚弹出的东西)
不确定这是否有意义。如果该值已经从“otherStack”中弹出,它将不会仍然在该堆栈中,因此您在偷看时不会看到它。@DaveCosta正确,请阅读我的最后一句话。操作顺序为
peek
push
pop
,以执行OP想要的操作。。。我想。但是-该方法将弹出的值作为参数。如果你还没有弹出这个值,你会怎么称呼它?@DaveCosta啊,来自OP的坏变量名。。。这就是将
推到堆栈上的值。我想这就是答案。是否值得将约束放在“如果参数堆栈中没有弹出的内容,则中止”这一行上,或者
pop()
本身就可以处理它呢?
pop()
方法会处理它。
public class Stack { 
    ...
    public int transferValue(Stack source) {
        int res = source.pop();  // throws exception if source is empty
        this.push(value);
        return res;
    }
}