对于循环循环只有3次

时间:2017-10-15 18:05:44

标签: c++ loops for-loop queue

为什么循环只有3次?

for (size_t i = 0; i < 10; i++)
{
    std::cout << "Dodany element kolejki: " << i << std::endl;
    queue.Enqueue(i);
}

当i等于3时,for循环总是中断。 这是Queue类的代码:

#ifndef QUEUE_H
#define QUEUE_H

#include "Node.h"
#include <stdexcept>

template<class T>
class Queue
{
public:
    Queue()
    {
        this->FirstElement = nullptr;
        this->LastElement = nullptr;
    }

    void Enqueue(T value)
    {
        if (0 == Size())
        {
            FirstElement = new Node<T>(value);
            LastElement = FirstElement;
        }
        else
        {
            LastElement->Previous = new Node<T>(value);
            LastElement = LastElement->Previous;
        }
    }

    T Dequeue()
    {
        if (0 == Size())
        {
            throw std::out_of_range("Out of range ! Empty stack !");
        }

        T element(FirstElement->Value);

        if (nullptr != FirstElement->Previous)
        {
            Node<T>* temp = FirstElement->Previous;
            delete FirstElement;
            FirstElement = temp;
        }
        else
        {
            delete FirstElement;
            FirstElement = nullptr;
            LastElement = nullptr;
        }

        return element;
    }

    int Size()
    {
        int queueSize = 0;
        Node<T>* element = FirstElement;

        if (nullptr != FirstElement)
        {
            while (nullptr != FirstElement->Previous)
            {
                ++queueSize;
            }

            ++queueSize; //Uwzglednienie ostatniego elementu, ktory nie jest policzony w petli
        }

        return queueSize;
    }

private:
    Node<T>* FirstElement;
    Node<T>* LastElement;
};
#endif // !QUEUE_H

节点结构的代码:

#ifndef NODE_H
#define NODE_H

template<class T>
struct Node
{
public:
    Node(T value)
    {
        this->Previous = nullptr;
        this->Value = value;
    }

    Node<T>* Previous;
    T Value;
};
#endif // !NODE_H

这是输出:

Dodany element kolejki: 0
Dodany element kolejki: 1
Dodany element kolejki: 2

当我删除对循环的enqueue方法的调用10次。编译器或异常抛出或任何其他任何类型的错误都没有警告。由于某种原因,它只是循环3次。

1 个答案:

答案 0 :(得分:1)

你的程序不会在循环迭代3停止,而是在3次迭代后挂起。 这很可能是由于Queue :: Size()函数似乎进入了无限循环。

我认为你的意思是大小如下:

int Size()
{
    int queueSize = 0;
    Node<T>* element = FirstElement;

    if (nullptr != FirstElement)
    {
        while (nullptr != element->Previous)
        {
            element = element->Previous;
            ++queueSize;
        }
        ++queueSize;
    }
    return queueSize;
}