2013-02-23 74 views
1

我需要寫一個方法,壓縮做以下操作;任何人都可以告訴我我做錯了什麼嗎? - 堆棧

方法compress的目標是從堆棧s1中刪除所有空元素。其餘(非空) 元素應按照其初始順序保留在s1上。輔助堆棧s2應作爲 用於來自s1的元素的臨時存儲。在此方法計算結束時, 堆棧s2應具有與計算開始時相同的內容。請參閱方法 main以瞭解方法compress的預期行爲的示例。

到目前爲止我有;

import net.datastructures.ArrayStack; 
import net.datastructures.Stack; 

public class Stacks { 

public static <E> void compress(Stack<E> S1, Stack<E> S2) { 

    int counter = 0; 
    while (!S1.isEmpty()) { 

    } 
    if (S1.top() == null) { 
     S1.pop(); 
    } else if (S1.top() != null) { 
     S2.push(S1.pop()); 

     counter++; 
    } 

    for (int i = counter; i < counter; i++) { 

     S2.push(S1.pop()); 
    } 
} 

public static void main(String[] args) { 
    // test method compress 
    Stack<Integer> S1 = new ArrayStack<Integer>(10); 
    S1.push(2); 
    S1.push(null); 
    S1.push(null); 
    S1.push(4); 
    S1.push(6); 
    S1.push(null); 

    Stack<Integer> S2 = new ArrayStack<Integer>(10); 
    S2.push(7); 
    S2.push(9); 

    System.out.println("stack S1: " + S1); 
    // prints: "stack S1: [2, null, null, 4, 6, null]" 

    System.out.println("stack S2: " + S2); 
    // prints: "stack s2: [7, 9]" 

    compress(S1, S2); 

    System.out.println("stack S1: " + S1); 
    // should print: "stack S1: [2, 4, 6]" 

    System.out.println("stack S2: " + S2); 
    // should print: "stack S2: [7, 9]" 
} 

} 

我想不通哪裏出錯,代碼在壓縮方法之前打印兩行,然後不打印任何內容。

+1

我想當你清理'S2'時,你需要執行'S1.push(S2.pop());' – 2013-02-23 20:58:19

+2

你是否嘗試在調試器中逐步調試代碼? – millimoose 2013-02-23 20:58:40

+1

此外,循環'while(!S1.isEmpty())'什麼也不做,你只檢查S1中的一個元素。 (除非這是一個錯字) – millimoose 2013-02-23 20:59:42

回答

0
while (!S1.isEmpty()) { 

} 

就在那裏,你有一個無限循環。

0

我想,如果下面

while (!S1.isEmpty()) { 
if (S1.top() == null) { 
    S1.pop(); 
} else if (S1.top() != null) { 
    S2.push(S1.pop()); 

    counter++; 
} 

}

寫......否則你的,而()內,你的內它必須是這樣的

for (int i = counter; i < counter; i++) { 

    S1.push(S2.pop()); 
} 

猜應該工作

+0

大量的幫助,謝謝!除了S1之外,它的所有工作都很棒;壓縮方法似乎清除S1?看不清是什麼錯誤:/ – 2013-02-23 22:02:41

+0

嘗試並調試您的代碼...希望您可以發現它正在清除s1的位置... – 2013-02-23 22:25:41

0

我發現你的代碼中有兩個錯誤。每個週期一個。

  1. while循環應該 後立即進行包裝的條件語句。
  2. 您的for循環的增量變量分配不當。

正確的版本應該是:

public static <E> void compress(Stack<E> S1, Stack<E> S2) { 
    int counter = 0; 

    while (!S1.isEmpty()) { 
     if (S1.top() == null) { 
      S1.pop(); 
     } else { 
      S2.push(S1.pop()); 
      counter++; 
     } 
    } 

    for (int i = 0; i < counter; i++) { 
     S1.push(S2.pop()); 
    } 
} 

編輯:等效for環路(也許你試着寫這個)可能是如下。

for (int i = counter; i > 0; i--) { 
    S1.push(S2.pop()); 
} 

2日編輯:for循環的變量進行切換(S2是S1中的地位,反之亦然)。

+0

這是清除堆棧併發出空的堆棧:s – 2013-02-23 22:05:23

+0

Eclipse控制檯讀取:Exception in線程「主」net.datastructures。EmptyStackException:堆棧爲空。 \t在net.datastructures.ArrayStack.pop(ArrayStack.java:117) \t在QUESTION5.Stacks.compress(Stacks.java:22) \t在QUESTION5.Stacks.main(Stacks.java:45) 堆S1 :[2,null,null,4,6,null] stack S2:[7,9] – 2013-02-23 22:05:42

+0

更正了此問題。檢查編輯後的版本。 :) – afsantos 2013-02-23 22:08:27

相關問題