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

时间:2017-02-11 02:30:48

标签: java stack

我有两个堆栈。 我希望能够将任何元素推到一个元素上,但只有当它从另一个元素中弹出时才会出现。

而不是我当前的功能如下:

public void pushValue(int poppedValue) {
  Stack.push(value)
}

我希望函数看起来像这样:

public void pushValue(pop() poppedValue) {
  Stack.push(value)
}

如何将pop()函数设置为参数,而不是int? 换句话说,如何将参数设置为仅接受从某处弹出的值?

2 个答案:

答案 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拆分为StackStackWithoutPush?如果是,那是超类/超级接口?这两种选择都不是完美的。无论哪种方式,子类在某种意义上违反了超类的契约。 (C.f. ListUnmodifiableList 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()该值。基本上,peekpush 然后pop