2012-10-26 104 views
1

如果我有一个实现为一系列节点(值,指向下一个节点的指针)的队列,那么横切该队列并检查特定值以及编辑队列的最佳方式是什么这样包含该值的所有节点都将被删除。但队列的顺序将保持不变。从队列中删除所有项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 * next_node){ 
       data = new_data ; 
       next = next_node ; 
      } 
      int data ; 
      node * next ; 
    }; 

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

这里头是queue.cpp

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

queue::queue() 
{ 
    front_p = NULL; 
    back_p = NULL; 
    current_size = 0; 
} 

void queue::enqueue(int item) 
{ 
    node* newnode = new node(item, NULL); 
    if (front_p == NULL) //queue is empty 
     front_p = newnode; 
    else 
     back_p->next = newnode; 
    back_p = newnode; 
    current_size ++; 
} 

int queue::dequeue() 
{ 
    //if there is only one node 
    int value = front_p->data; 
    if (front_p == back_p) 
    { 
     front_p = NULL; 
     back_p = NULL; 
    } 
    //if there are two or more 
    else 
    { 
     node* temp = front_p; 
     front_p = temp->next; 
     delete temp; 
    } 
    current_size --; 
    return value; 
} 

int queue::front() 
{ 
    if (front_p != NULL) 
     return front_p->data; 
} 

bool queue::empty() 
{ 
    if (front_p == NULL && back_p == NULL) 
     return true; 
    else 
     return false; 
} 

int queue::size() 
{ 
    return current_size; 
} 

int queue::remove(int item) 
{ 
//????? 
} 
+0

你是什么意思_check?检查队列中是否存在特定值? – jogojapan

+0

那么,你只要遍历它,并随时移除节点。没有看到你的实施,我真的不知道我们能在这里如何帮助你。 – Mat

+0

最好的方法是编写一些完全符合你所说的代码。对不起,如果这看起来很奇怪,但你期待什么样的答案?除非您对问题的内容有所了解(通过发布代码或解释它是什么,例如您不明白),这很难提供帮助。我猜想你被困在如何从列表中删除节点,但如果是这样的话,请说出来。 – john

回答

2

您需要遍历列表,检查每个节点的值。如果您看到序列A→B→C,其中B是要删除的值,则需要将链接从A更改为指向C而不是B.

为了方便您,你需要保持对最后一个节点的引用以及当前节点。如果当前节点的值等于要删除的值,则将最后一个节点的下一个指针改为当前节点的下一个指针。确保在继续之前释放当前节点的内存。

0

如果您的队列公开标准的迭代器,最好的方法是使用一个标准的算法:针对特定VALUE_

queue.erase(std::remove(queue.begin(), queue.end(), value_to_remove), queue.end());