2016-05-17 64 views
0

出於某種奇怪的原因,無論何時我打印反轉堆棧的大小(用於測試目的),我都會繼續獲取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類:

公共類堆棧{

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

} 

}

+1

如果沒有看到'Stack'(以及「size」 *初始化*)。 –

+0

你在使用java.util.Stack嗎? –

+0

在任何情況下,儘管我沒有看到任何解釋您描述的大小問題的東西,但是我會在'enqueue()'和'dequeue()'中看到一些嚴重的缺陷。如果'Stack'應該是'java.util.Stack',你的代碼甚至不會編譯。 –

回答

1

我使用java.util.Stack試過了你的代碼,它和java.util.Stack一起工作的很好。另外,您直接從dequeue方法(如果它是java.util.Stack,則不可能)訪問Stack的size變量,並使用getSize()獲取堆棧的大小(對於必須使用的java.util.Stack size()方法)。有了這些證據,我假設你已經實現了你自己的Stack類。最可能的錯誤是來自你的Stack類的實現。請看看你的Stack類。如果你想要更具體的答案,你應該指定你是否實現了自己的Stack類。如果是的話,你應該提供你的Stack和其他相關類的實現。

P.S:您的出列方法無法正常工作。請按照Alin Gabriel的建議。如果您的堆棧中沒有isEmpty()方法,您可以使用original.getSize()> 0而不是!original.isEmpty()

+0

你是正確的,我實現了我自己的堆棧,這就是爲什麼我得到了錯誤。我切換到java.util.Stack,現在沒問題。感謝您指出了這一點。 –

0
while (original != null) 

在這裏,這是一個錯誤。你應該測試原件是不是空的:-) 就這樣,你正在檢查原件是否被實例化。

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

你說得很對,但這並不能回答真正的問題。 –

+0

謝謝,Alin。你是絕對正確的。 –