2017-04-11 78 views
0

我创建了一个程序,它将从队列中删除输入号码的每个实例,但无法弄清楚如何修改它,以便它只会删除所述号码的第一个实例。从队列中删除特定号码的第一个实例

这是我的计划,截至目前:

#include <iostream> 
#include <list> 
#include <stack> 
#include <queue> 


using namespace std; 


int main(){ 
    queue<int> q; 

    int size; 
    cout << "Enter the size of the queue: "; 
    cin >> size; 
    int val; 

    for (int i = 0; i < size; i++){ 
     cout << "Enter a value to insert into the queue: "; 
     cin >> val; 
     q.push(val); 

    } 

    int value; 
    bool found = false; 
    queue<int> temp; 
    queue<int> printQueue; 
    cout << "Which value would you like to remove: "; 
    cin >> value; 

    while (!q.empty()){ 
     if (q.front() == value) 
      q.pop(); 
     else{ 
      temp.push(q.front()); 
      q.pop(); 
     } 
    } 
    q = temp; 
    printQueue = q; 

while (!printQueue.empty()){ 
     cout << printQueue.front() << " "; 
     printQueue.pop(); 
    } 

} 

我将如何修改呢?我正在考虑在while循环中放置一个bool值来删除所有内容,但是一旦它找到一个而不是完成将其他队列复制到临时目录的时候它就会被踢出去。

任何帮助将是伟大的。

+1

每当你删​​除一个元素时,尽早退出'while(!q.empty())'循环。然后添加另一个循环来将剩余的元素从'q'传递给'temp'。你应该考虑使用更合适的容器。 –

+0

为了一个测试学习,所以要学习这一个!但是,谢谢,会尝试 –

回答

0

如果需求允许,可以使用双端队列,它允许迭代和修改。

#include <algorithm> 
#include <queue> 

int value; 

std::deque<int> q; 

//insert numbers 
//define value 

//find first instance of value 
auto iter = std::find(std::begin(q), std::end(q), value); 

//if found, erase it 
if (iter != std::end(q)) { 
    q.erase(iter); 
} 
0

我觉得你非常接近,你可以在你的while循环中添加一个验证来只弹出一次你的元素。

int main(){ 
queue<int> q; 

int size; 
cout << "Enter the size of the queue: "; 
cin >> size; 
int val; 

for (int i = 0; i < size; i++){ 
    cout << "Enter a value to insert into the queue: "; 
    cin >> val; 
    q.push(val); 

} 

int value; 
bool found = false; 
queue<int> temp; 
queue<int> printQueue; 
cout << "Which value would you like to remove: "; 
cin >> value; 

while (!q.empty()){ 
    if (q.front() == value && found == false) 
     q.pop(); 
     found = true; 
    else{ 
     temp.push(q.front()); 
     q.pop(); 
    } 
} 
q = temp; 
printQueue = q; 

while (!printQueue.empty()){ 
    cout << printQueue.front() << " "; 
    printQueue.pop(); 
    } 

}