2014-02-25 27 views
0

如果堆棧中有奇數個值,堆棧頂部的值爲沒有移動。編寫一個將整數棧作爲參數並從堆棧底部開始連續編號對的方法

有什麼不對?..?

public static void switchPairs(Stack<Integer> st){ 
    Queue<Integer> q = new LinkedList<Integer>(); 
    int size = st.size(); 
     
    for(int i = 0; i < size; i++){ 
         
        int a = st.pop(); 
        int b = st.pop(); 
        q.add(a); 
        q.add(b); 
    } 
} 
+0

你認爲什麼是錯的?你總是以成對的方式進行操作,最後一個值應該放在哪裏?這應該給你例外,因爲堆棧在幾次迭代後是空的。 –

回答

1

我覺得有幾個問題,你的代碼:

  1. 你應該去,直到大小/ 2。您每次迭代都會彈出兩次。然後檢查長度是否奇數,如果是,則添加最後一個剩餘元素 。
  2. 我認爲你的代碼只能顛倒你的堆棧。

這不是測試,但我認爲它應該看起來像這樣(也冒昧地擺脫一些無用的變量 - 性能可能不是一個問題在這種情況下)。

讓你的方法返回一個堆棧,這樣使用它:

st = switchPairs(st); 

而且方法體:

public Stack<Integer> switchPairs(Stack<Integer> st){ 
     Stack<Integer> q = new Stack<Integer>(); 
     for(int i = 0; i < st.size()-1; i++){   
      q.push(st.elementAt(i+1)); 
      q.push(st.elementAt(i++))); 
     } 
     if(st.size()%2==1){ 
      q.push(st.pop()); 
     } 
     return q; 
} 

爲了保持無效(從Here採取使用)

AtomicReference<Stack<Integer>> ref = new AtomicReference<Stack<Integer>>(st); 
switchPairs(ref); 
st = ref.get(); 

而方法的主體:

public void switchPairs(AtomicReference<Stack<Integer>> ref){ 
     Stack<Integer> q = new Stack<Integer>(); 
     for(int i = 0; i < ref.get().size()-1; i++){   
      q.push(ref.get().elementAt(i+1)); 
      q.push(ref.get().elementAt(i++))); 
     } 
     if(ref.get().size()%2==1){ 
      q.push(ref.get().pop()); 
     } 
     ref.set(q); 
} 
+0

這不起作用,我測試了它,它返回原堆棧的前半部分....? – bazookyelmo

+0

剛編輯我的答案,請再試一次。 –

+0

我認爲它把它留作隊列,我; m試圖改變原始堆棧 – bazookyelmo