2012-10-22 176 views
1

我需要创建基于关闭这个头(使用链表)的C++队列:为什么我的C++队列不能正常出队?

class queue 
{ 
    public: 
    queue(); // constructor - constructs a new empty queue. 
    void enqueue(int item); // enqueues item. 
    int dequeue(); // dequeues the front item. 
    int front(); // returns the front item without dequeuing it. 
    bool empty(); // true iff the queue contains no items. 
    int size(); // the current number of items in the queue. 
    int remove(int item); // removes all occurrances of item 
     // from the queue, returning the number removed. 

    private: 
    class node // node type for the linked list 
    { 
     public: 
      node(int new_data, node * prev_node, node * next_node){ 
       data = new_data ; 
       next = next_node ; 
       prev = prev_node ; 
      } 
      int data ; 
      node * next ; 
      node * prev ; 
    }; 

    node * front_p ; 
    node * back_p ; 
    int current_size ; // current number of elements in the queue. 
}; 

这是我到目前为止有:

#include <iostream> 
#include "queue.h" 
using namespace std; 

queue::queue(){ 

    current_size = 0; 
    front_p = new node(NULL, NULL, NULL); 
    back_p = new node(NULL, NULL, NULL); 
} 

void queue::enqueue(int item){ 

    if (current_size == 0){ 
     node * new_node; 
     new_node = new node(item, back_p, front_p); 
     front_p->prev = new_node; 
     back_p->next = new_node; 
     current_size = current_size + 1; 
    } 

    else if (current_size > 0){ 
     node * new_node; 
     new_node = new node(item, back_p, back_p->next); 
     back_p->next = new_node; 
     new_node->next->prev = new_node; 
     current_size = current_size + 1; 
    } 
} 

int queue::dequeue(){ 

    if (current_size > 0) { 

    node *remove = front_p->prev; 

    return remove->data; 

    remove-> prev->next = front_p; 
    front_p->prev = remove->prev; 

    delete remove; 

    current_size = current_size - 1; 
    } 

    else if (current_size == 0) { 
     return NULL; 
    } 

    else { 
     return NULL; 
    } 
} 

int queue::front(){ 

    return front_p -> prev -> data; 
} 

bool queue::empty(){ 

    return current_size == 0; 
} 

int queue::size(){ 

    return current_size; 
} 

int queue::remove(int item){ 

    for (int i = 0; i < current_size; i++){ 


    } 
    return NULL; 
} 

int main(){ 

    int int1, int2; 
    cout << "Welcome to the double linked list test program" << endl << "Please enter a #" << endl; 
    cin >> int1; 
    cout << "Another number" << endl; 
    cin >> int2; 

    queue * main_queue; 
    main_queue = new queue(); 

    main_queue->enqueue(int1); 
    main_queue->enqueue(int2); 

    cout << "The front element is: " << main_queue->front() << endl; 

    cout << "I have dequeued: " << main_queue->dequeue() << endl; 

    cout << "The front element now: " << main_queue->front() << endl; 

} 

但是当我运行该程序,我得到相同的数字三次,表明它没有正确的出队?

回答

1

这是你的问题:

if (current_size > 0) { 
return front_p->data; 
node * temp = front_p; 
front_p = front_p->prev; 
delete temp; 
} 

你的if语句里面做的第一件事就是从函数返回。在return之后,函数中没有更多的代码被执行。

1

我认为你需要改变你的出队代码看起来像这样。

if(current_size > 0) 
{ 
    node *remove = front_p->prev; 
    remove-> prev->next = front_p; 
    front_p->prev = remove->prev;  
    current_size = current_size - 1; 
    return remove->data; 
} 

如上所述,您的return语句不允许任何其他代码在其下执行。

+0

你真的觉得他应该看起来像这样吗? Plz检查你的if语句的最后2行。 – 2012-10-22 11:45:18

+0

@Layne哎呀!最好不要删除它。 :P *固定* – DaveyLaser