2013-02-23 152 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

相关问题