使用两个堆栈奇怪错误实现队列

时间:2016-05-17 21:06:53

标签: java

由于一些奇怪的原因,每当我打印反向堆栈的大小(用于测试目的)时,我会继续得到7.为什么会这样?反向堆栈是否应该是空的,因为没有任何东西被推到它上面?谢谢!

public class QueueViaStacks {

    static Stack original;
    static Stack reversed;

    // push everything into the first stack
    public void enqueue(Object item) {

        // create stack if it is not yet created
        if (original == null)
            original = new Stack();

        original.push(item);

    }

    public Object dequeue() {

        if (reversed == null)
            reversed = new Stack();

        System.out.println(reversed.size);

        Object temp;

        // reverse stack by copying everything from first stack to second stack
        if (reversed.isEmpty()) {
            while (original != null) {
                temp = original.pop();
                reversed.push(temp);
            }
        }

        return reversed.pop();

    }

    public int size() {

        return original.getSize() + reversed.getSize();

    }

    public static void main(String[] args) {

        QueueViaStacks stack = new QueueViaStacks();

        stack.enqueue('T');
        stack.enqueue('E');
        stack.enqueue('S');
        stack.enqueue('T');
        stack.enqueue('I');
        stack.enqueue('N');
        stack.enqueue('G');

        stack.dequeue();

    }

}

下面是我的Stack类:

public class Stack {

static Node top;
static int size = 0;

public void push(Object item) {

    Node t = new Node(item);
    t.next = top;
    top = t; 
    size++;

}

public Object pop() {

    while (top != null) {
        Object temp = top.item;
        top = top.next;
        size--;
        return temp;
    }
    return null;

}

public int getSize() {

    return size;

}

public boolean isEmpty() {

    if (size == 0)
        return true;
    return false;

}

public void print(Stack stack) {

    Node temp = top;
    while (temp != null) {
        System.out.println(temp.item);
        temp = temp.next;
    }

}

}

2 个答案:

答案 0 :(得分:1)

我使用java.util.Stack尝试了你的代码,它在java.util.Stack中运行良好。此外,您正在从dequeue方法直接访问Stack的大小变量(如果它是java.util.Stack则不可能),并使用getSize()来获取堆栈的大小(对于java.util.Stack,您必须使用而不是size()方法。。有了这些证据,我假设你已经实现了自己的Stack类。最可能的错误来自Stack类的实现。请查看您的Stack类。如果您想要更具体的答案,您应该指定是否已经实现了自己的Stack类。如果是,您应该提供Stack和其他相关类的实现。

P.S:您的出列方法无效。请遵循Alin Gabriel的建议。如果你的堆栈中没有isEmpty()方法,你可以使用original.getSize()> 0代替!original.isEmpty()

答案 1 :(得分:0)

while (original != null)

这是一个错误。你应该测试原件是不是空的:-) 实际上,您正在检查原始实例是否已实例化。

while(!original.isEmpty()) {
    reversed.push(original.pop()); 
}