2017-02-11 25 views
-2

我有兩個堆棧。 我希望能夠將任何元素推到一個元素上,但只有當元素從另一個元素中彈出時纔可以。在Java中,你如何執行Stack.pop()作爲參數?

相反我目前的功能是這樣的:

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

我希望函數這個樣子,雖然:

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

我怎麼能設置pop()函數作爲參數,而不是一個int? 換句話說,我該如何設置參數才接受從某處彈出的值?

+0

只要通過第一個堆棧,以便該方法可以照顧彈出該值並將其推入堆棧二。 – Tom

+0

你可以通過你的方法堆棧本身並讓它彈出值(雖然這可能會導致一些設計問題),但是沒有辦法保證'int'將具有特定的「歷史」。 – MikaelF

+0

你的意思是你想要一個操作從一個堆棧中彈出一個值並將其放到另一個堆棧上?或者你是否想要一個只接受過去某個時間點已經從另一個堆棧中取出的值的堆棧? –

回答

1

你的語法是不可能的,但你可以使第二組的成員字段,然後push當且僅當值存在,當你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

+0

不確定這是否合理。如果該值已經從「otherStack」彈出,它將不會在該堆棧上,所以當你偷看時你不會看到它。 –

+0

@DaveCosta正確,讀我的最後一句話。操作的順序是'peek','push','pop'來做OP想要的......我想。 –

+1

但是 - 該方法將彈出的值作爲參數。如果你還沒有彈出價值,你會怎麼稱呼它? –

1

Java沒有辦法表達這個約束。 (或用任何其他語言,AFAIK)

(IMO)你可以做的最好的做法是將第二個Stack作爲參數傳遞給第一個,並使第一個負責彈出一個值;例如

public class Stack { 
    ... 
    public int transferValue(Stack source) { 
     int res = source.pop(); 
     this.push(value); 
     return res; 
    } 
} 
相關問題