2012-10-26 123 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());