2015-03-31 24 views
0

我的程序有問題。我正在嘗試將一堆數字放入循環鏈接隊列中,然後重新放入堆棧。該程序編譯並運行,但在程序完成後,我的程序將進入空白的無限循環。我假設我是因爲功能isQueue.enqueue(temp)部分代碼,因爲當我刪除它時,我的程序不再進入無限循環。問題是我沒有看到我在做什麼錯誤,將保持在一個無限循環。如何在我的程序中跳出無限循環

功能

#include <fstream> 
#include <iostream> 
#include <cassert> 
#include "stack.h" 
#include "queuei.h" 

void stackToqueue(stack &isStack, queue &isQueue) 
{ 
    int temp; 
    stack newStack; 
    while (!isStack.isEmpty()) 
    { 
     temp = isStack.pop(); 
     newStack.push(temp); 
    } 
    newStack.displayStack(); 
    isStack = newStack; 
    isStack.displayStack(); 

    while (!newStack.isEmpty()) 
    { 
     temp = newStack.pop(); 
     isQueue.enqueue(temp);//stuck in loop 
    } 
    isQueue.displayQueue(); 
    while (!isQueue.isEmpty()) 
    { 
     temp = isQueue.dequeue(); 
     newStack.push(temp); 
    } 
    temp = isQueue.dequeue(); 
    newStack.push(temp); 

    isStack = newStack; 

} 

queue.cpp

#include "queuei.h" 

queue::queue() 
{ 
    rear = NULL; 
    front = NULL; 
} 

bool queue::isEmpty() 
{ 
    if (front == rear) 
    { 
     return true; 

    } 
    return false; 

} 
void queue::enqueue(int element) 
{ 
    nodes *temp = new nodes; 
    temp->item = element; 
    temp->next = NULL; 
    if (front == NULL) 
    { 
     front = temp; 
    } 
    else 
    { 
     rear->next = temp; 
    } 
    rear = temp; 
    rear->next = front; 
} 
int queue::dequeue() 
{ 
    nodes *tem = new nodes; 
    tem = front; 
    if (front == NULL) 
    { 

     cout << "\nQueue is Emtpty\n"; 

    } 
    else 
    { 

     front = front->next; 

    } 
    return tem->item; 
} 

void queue::dequeue(int remove) 
{ 
    if (front == NULL) 
    { 

     cout << "\nQueue is Emtpty\n"; 

    } 
    else 

    { 
     front = front->next; 
    } 
} 


void queue::displayQueue() 
{ 
    nodes *p = new nodes; 
    p = front; 

    if (front == NULL) 
    { 
     //queue is empty 
    } 
    else 
    { 
     cout << "F "; 
     while (p != rear) 
     { 
      cout << p->item << " "; 
      p = p->next; 

     } 
     cout << p->item; 

     cout << " L"; 

    } 

} 
+0

你說'而(!isQueue.isEmpty())'導致一個無限循環,但在你的代碼'//卡在loop'點到另一條線路 – phts 2015-03-31 16:05:54

+0

@WhozCraig抱歉,但錯誤的事情現在修復它 – DarkT 2015-03-31 16:48:09

+0

'enqueue'沒有循環。但是,你應該知道你的'isEmpty'是錯誤的。當隊列中有一個**節點(並且「front」和「rear」都指向它,因爲它們應該,但是你返回「true」時)'if(front == rear)'將產生* true *在那個*特定的情況下(這意味着當它不是的時候,你錯誤地聲稱隊列是空的,更糟糕​​的是,當它*爲*時,錯誤地聲明隊列是* not * empty)。'isEmpty'所需的唯一代碼應該是'return rear == nullptr;'。 – WhozCraig 2015-03-31 18:06:33

回答

0

問題是隊列::的isEmpty(),因爲當有一個單一的,它將返回true節點並且前面和後面都指向相同的節點。檢查它們是否爲空將解決問題。

bool queue::isEmpty() 
{ 
    if (front == NULL && rear == NULL) 
    { 
     return true; 
    } 
    return false; 
}