谁能告诉我我做错了什么? - 堆栈

时间:2013-02-23 20:55:17

标签: java methods stack counter

我需要编写一个方法,压缩以执行以下操作;

的目标 方法compress是从栈s1中删除所有null元素。剩下的(非空) 元素应按其初始顺序保存在s1上。辅助堆栈s2应该用作 来自s1的元素的临时存储。在这种方法的计算结束时, stack 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]"
}

}

我无法弄清楚我出错的地方,代码在压缩方法之前打印两行,然后什么都不打印。

3 个答案:

答案 0 :(得分:0)

while (!S1.isEmpty()) {

}

就在那里,你有一个无限循环。

答案 1 :(得分:0)

我想在你的while()中写下if ... else,如下所示

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());
}

猜它应该有用

答案 2 :(得分:0)

我在你的代码中发现了两个错误。每个周期都有一个。

  1. 你的while循环应该正好包装条件 它。
  2. 您的for循环的增量变量已严重分配。
  3. 正确的版本应该是:

    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());
    }
    

    第二次编辑: for循环中的变量已切换(S2位于S1位置,反之亦然)。