将数据读入队列

时间:2011-02-18 17:57:14

标签: c++ queue

使用以下(不完整)代码,我试图将10个字符串插入到字符串队列中(进一步声明和定义),然后一次读出一个内容,但队列中的输出对应于预期产出

int main()
{           
    ifstream File;
    for (int count = 1; count <= 10; count ++)
    {
        string filename;    
        stringstream ss;
        ss << "PersonLists/PL" << count << ".txt";
        filename = ss.str();
        WaitingListList.Add(filename);

        WaitingListList.Remove(filename);
                cout << filename << endl;
        WaitingListList.Add(filename);
    }
}

以下是我对代码的期望,并且我已经通过直接插入输出流,使用filename中看到的stringstream验证了int main()对象是否正确构建在filename = ss.str()行之后。

PersonLists/PL1.txt
PersonLists/PL2.txt
PersonLists/PL3.txt
PersonLists/PL4.txt
PersonLists/PL5.txt
PersonLists/PL6.txt
PersonLists/PL7.txt
PersonLists/PL8.txt
PersonLists/PL9.txt
PersonLists/PL10.txt

但是,当我打印队列的内容时,这是我收到的输出,我无法识别文件名中可能指示其原因的任何模式。有人在这里查看代码可以找出发生了什么吗?我已经使用相同的队列模板在程序的其他部分成功使用了相同的过程。

PersonLists/PL1.txt
PersonLists/PL1.txt
PersonLists/PL2.txt
PersonLists/PL1.txt
PersonLists/PL3.txt
PersonLists/PL2.txt
PersonLists/PL4.txt
PersonLists/PL1.txt
PersonLists/PL5.txt
PersonLists/PL3.txt

queue.h

#ifndef QUEUE_H
#define QUEUE_H
using namespace std;
template <class Type>
class queue
{
private:
    Type *Contents;
    int Front, Back;
    int QueueSize;
public:
    queue(int queuesize = 10);
    ~queue();
    bool Empty() const;
    bool Full() const;
    bool Remove(Type&);
    bool Add(Type&);

};
#endif

queuetemplate.h

#ifndef QUEUETEMPLATE_H
#define QUEUETEMPLATE_H
#include "queue.h"
using namespace std;

// Constructor
template <class Type>
queue<Type> :: queue(int queuesize): 
    Front(0), Back(0),
    QueueSize(queuesize),
    Contents(new Type[queuesize + 1])
{}

// Destructor
template <class Type>
queue<Type> :: ~queue()
{
    delete[] Contents;
}

// Tests
template <class Type>
bool queue<Type> :: Empty() const
{
    return (Front == Back) ? true : false;
}

template <class Type>
bool queue<Type> :: Full() const
{
    return ((1 + Back) % (QueueSize + 1) == Front) ? true : false;
}

// Push and pop
template <class Type>
bool queue<Type> :: Remove(Type& FrontElement)
{
    if (Empty())
    {
        return false;
    }
    else
    {
        FrontElement = Contents[Front];
        Front = (Front + 1) % (QueueSize + 1);
        return true;
    }
}

template <class Type>
bool queue<Type> :: Add(Type& NewElement)
{
    if(Full())
    {
        return false;
    }
    else
    {
        Contents[Back] = NewElement;
        Back = (Back + 1) % (QueueSize + 1);
        return true;
    }
}
#endif

2 个答案:

答案 0 :(得分:3)

第一遍:你添加PL1,删除PL1,添加PL1。队列现在包含PL1。

第二遍:你添加PL2,删除PL1(在前面),添加PL1(文件名由删除更新)。队列现在包含PL2,PL1

第三遍:你添加PL3,删除PL2(在前面),添加PL2(文件名由删除更新)。队列现在包含PL1,PL3,PL2

依旧......

编辑:前7次迭代

  • 添加“PL1”,删除/打印“PL1”,添加“PL1” - 队列:“PL1”
  • 添加“PL2”,删除/打印“PL1”,添加“PL1” - 队列:“PL2”,“PL1”
  • 添加“PL3”,删除/打印“PL2”,添加“PL2” - 队列:“PL1”,“PL3”,“PL2”
  • 添加“PL4”,删除/打印“PL1”,添加“PL1” - 队列:“PL3”,“PL2”,“PL4”,“PL1”
  • 添加“PL5”,删除/打印“PL3”,添加“PL3” - 队列:“PL2”,“PL4”,“PL1”,“PL5”,“PL3”
  • 添加“PL6”,删除/打印“PL2”,添加“PL2” - 队列:“PL4”,“PL1”,“PL5”,“PL3”,“PL6”,“PL2”
  • 添加“PL7”,删除/打印“PL4”,添加“PL4” - 队列:“PL1”,“PL5”,“PL3”,“PL6”,“PL2”,“PL7”,“PL4”< / LI>

答案 1 :(得分:0)

由于您尚未将其标记为家庭作业,我建议您使用std::queue

它已经过测试(数千次),它可以工作,您不必编写它,只需使用它。

请参阅:http://www.cplusplus.com/reference/stl/queue/