2016-03-05 63 views
1

當我使用堆棧實現隊列時,遇到了一個奇怪的問題。任何人都可以給我一個想法嗎? 當我這樣寫代碼時,這是錯誤的。因爲如果我創建myQueue中的一個對象,然後推(1)推(2)彈出,它會返回1。然而它應該是2.使用堆棧實現隊列時出錯(JAVA)

class MyQueue { 
Stack<Integer> s1=new Stack<Integer>(); 
Stack<Integer> s2=new Stack<Integer>(); 
// Push element x to the back of queue. 
public void push(int x) { 
    s1.push(x); 
} 

// Removes the element from in front of queue. 
public void pop() { 
    if(s2.size()!=0) 
     s2.pop(); 
    else{ 
     for(int i = 0; i<s1.size(); i++){ 
      s2.push(s1.pop());     
     } 
     s2.pop(); 
    } 
} 
} 

但是,如果我修改像下面的代碼,它是正確的,但我找不到這兩個類之間的區別。

class MyQueue { 
Stack<Integer> s1=new Stack<Integer>(); 
Stack<Integer> s2=new Stack<Integer>(); 
// Push element x to the back of queue. 
public void push(int x) { 
    s1.push(x); 
} 

// Removes the element from in front of queue. 
public void pop() { 
    if(!s2.empty()) 
     s2.pop(); 
    else{ 
     while(!s1.empty()) 
      s2.push(s1.pop());     
     s2.pop(); 
    } 
} 
} 

非常感謝!

回答

2

問題是,在您的for循環中,您增加了i,而同時s1.size()正在減少。想象一下s1開頭有5個元素。

  1. 迭代:i = 0,s1.size() = 5
  2. 迭代:i = 1,s1.size() = 4
  3. 迭代:i = 2,s1.size() = 3
  4. 迭代:i = 3,s1.size() = 2

循環將停止,因爲i < s1.size()現在是false,即使在s1中仍有元素。

1

的問題是for循環的第一個例子:

for(int i = 0; i<s1.size(); i++){ 
     s2.push(s1.pop());     
} 

假設s1size是2,一旦我們推的兩個元素。現在,在第一次迭代之後,從s1彈出一個元素,因此size變爲1.由於分解條件爲i < s1.size()i在第一次迭代後爲1),所以它突破了循環並且一個元素留在了s1中。

第二個示例使用while循環,因此不會出現這種情況。

此外,我會建議更改返回類型pop方法爲int

1

for(int i = 0; i<s1.size(); i++){ 
    s2.push(s1.pop());     
} 

不等同於

while(!s1.empty()) 
    s2.push(s1.pop()); 

注意s1.size()變化在每次迭代,所以你最終會終止循環之前的所有元素都蹦出來的s1。例如,假設您有一個包含4個元素(1,2,3和4)的堆棧。然後,這些是在每次迭代開始時i,s1.size()和堆疊元件本身的值:

i s1.size() stack 
0   4 1,2,3,4 
1   3 1,2,3 
2   2 1,2 // here the loop stops