【问题标题】:C++ dequeueing issues... dequeue returns same element repeatedlyC++ 出队问题...出队重复返回相同的元素
【发布时间】:2013-02-22 09:57:26
【问题描述】:

所以我有下面的 sn-p 代码...

for(int k=0; k<10; k++){
    State newState;
    newState = queue.dequeue();
    //...do stuff with `newState`...
}

我遇到的问题是,经过数小时的测试,我意识到每次代码到达 newState = queue.dequeue() 时,newState 都会将完全相同的 State 实例出列,而不是在先进先出时尚......我似乎无法弄清楚我到底做错了什么:/

下面是我的队列类 .h 和 .cpp 代码...

//queue.h

#include <iostream>
#include <stdio.h>

#include "state.h"

using namespace std;

// Node class
class Node {
public:
    State elem;
    Node* next;
    Node() {}
    State Elem() { return elem; }
    Node* Next() { return next; }
};

// Queue class
class Queue {
    Node *head;
    Node *tail;
  public:
    Queue();
    ~Queue();
    bool isEmpty();
    int size();
    void enqueue(State);
    State dequeue();
};

还有我的 .cpp 文件...

//queue.cpp

#include "queue.h"

#include <iostream>

Queue::Queue(){
    head = NULL;
    tail = NULL;
}

Queue::~Queue(){
    if(!isEmpty()){
        while(head){
            Node *del = head;
            head = head->next;
            delete del;
        }
    }
}

bool Queue::isEmpty(){
    return head == NULL;
}

int Queue::size(){
    int count = 0;
    if(isEmpty()){
        return count;
    } else {
        Node *temp = head;
        while(temp){
            temp = temp->next;
            count++;
        }
        delete temp;
        return count;
    }
}

//insert s to back of queue
void Queue::enqueue(State s){
    Node* newNode = new Node();
    newNode->elem = s;
    newNode->next = NULL;
    if(s.checkZ()){
        cout << "Puzzle solved!" << endl << endl;
        exit(0);
    }
    if(head==NULL){
        head = tail = newNode;
    } else {
        tail->next = newNode;
        tail = newNode;
    }
}

//remove State from front of queue
State Queue::dequeue(){
    if(isEmpty()){
        cout << "This puzzle has no solution." << endl;
        cout << "Exiting program..." << endl << endl;
        exit(0);
    } else {
        State ret = head->Elem();
        Node *del = head;
        head = head->next;
        delete del;
        return ret;
    }
}

提前感谢您的帮助,我很乐意根据请求显示我的代码的任何其他 sn-ps

编辑:这是我的 State 复制构造函数...

State::State(const State &rhs){
    pieces = rhs.pieces;
    pieceCount = rhs.pieceCount;
    rows = rhs.rows; cols = rhs.cols;
    currentState = rhs.currentState;
    prevStates = rhs.prevStates;
    prevStateCount = rhs.prevStateCount;
    moves = rhs.moves;
    moveCount = rhs.moveCount;
}

【问题讨论】:

  • 不是您问题的答案,而是:您的程序逻辑与Queue 的实现紧密耦合。将Queue 设为模板类而不是硬编码以保存States 是有意义的。解决难题的逻辑也不应该在容器内完成,而应在使用容器的代码中完成。如果你把这些东西分开,也许你会发现它更容易调试。
  • 我在Queue 代码中看不到任何错误。可能State的拷贝构造函数有问题?
  • 是的,我知道。我应该改变它。我已经参加了一些编码马拉松比赛,因为这个程序将在 12 小时内到期,所以我开始有点马虎了。但从我的测试来看,enqueue 似乎工作正常。大小按应有的方式递增。我认为这与我分配 newState 的方式有关,但我不确定......
  • 也不是答案,但为什么不使用 std::queue 代替?
  • 好的,我用 State 的复制构造函数更新了原始问题......对于这个分配,我们必须从头开始制作所有数据结构。

标签: c++ linked-list queue


【解决方案1】:

size()

delete temp;

虽然不危险,但由于此时 temp 为空,它看起来很可疑。您也可以删除 if/else,因为当 head 为 null 时,count 不会递增。

否则我不明白为什么它应该一次又一次地返回相同的元素。唯一的原因可能是一些代码,它多次插入同一个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多