队列模拟问题

我的计划是从文件打印信息的队列中,但我有问题,我下面的代码。 当我运行程序的时候,保持循环。 我不能找出问题。 任何帮助吗?

#include <iostream> #include <fstream> #include <string> #include <iomanip> #include <queue> #include <list> using namespace std; void simulation(ifstream &infile); void processArrival(int *newEvent, ifstream &inFile, list<int> eventList,queue<int> printQueue); void processDeparture(int *newEvent, list<int> eventList,queue<int> printQueue); string name[100]; int timeAccepted[100]; int fileSize[100]; int i = 1; int j = 1; int currentTime; bool checker = true; int main(void) { ifstream inFile; string fileName; int i = 0; inFile.open("123.txt", ios::in); simulation(inFile); /*while(inFile.peek() != EOF ) { inFile>>name[i]>>timeAccepted[i]>>fileSize[i]; i++; } for(int s = 0; s < i; s++) { cout << name[s] << timeAccepted[s] << fileSize[s] <<endl; }*/ return 0; } void simulation(ifstream &inFile) { queue<int> printQueue; list<int> eventList; int *newEvent; while(inFile.peek() != '\n') { inFile>>name[0]>>timeAccepted[0]>>fileSize[0]; } eventList.push_front(timeAccepted[0]); int checkEmpty = eventList.empty(); newEvent = &eventList.front(); while(checkEmpty ==0) { newEvent = &eventList.front(); if(checker) { processArrival(newEvent, inFile, eventList, printQueue); } else { processDeparture(newEvent, eventList, printQueue); } checkEmpty = eventList.empty(); } } void processArrival(int *newEvent, ifstream &inFile, list<int> eventList,queue<int> printQueue) { int atFront=0; atFront = printQueue.empty(); cout << atFront <<endl; printQueue.push(*newEvent); cout << printQueue.front() <<endl; eventList.remove(*newEvent); int temp; if(atFront==1) { currentTime = *newEvent + fileSize[0]; cout << name[0] << " @@ " << *newEvent << " @@ " << currentTime << endl; eventList.push_back(currentTime); } checker = false; if(inFile.peek() != EOF ) { inFile>>name[i]>>timeAccepted[i]>>fileSize[i]; eventList.push_back( timeAccepted[i] ); i++; checker = false; if(eventList.back() <= eventList.front()) { temp = eventList.back(); eventList.back() = eventList.front(); eventList.front() = temp; checker = true; } } } void processDeparture(int *newEvent, list<int> eventList,queue<int> printQueue) { printQueue.pop(); eventList.pop_front(); int checkEmpty = 1; checkEmpty = printQueue.empty(); int temp; if(checkEmpty ==0) { currentTime = *newEvent + fileSize[j]; cout << name[j] << " " << *newEvent << " " << currentTime << endl; eventList.push_back(currentTime); checker = true; if(eventList.back() < eventList.front()) { temp = eventList.back(); eventList.back() = eventList.front(); eventList.front() = temp; checker = false; } j++; } }

--------------解决方案-------------

processArrivalprocessDeparture功能正在他们eventListprintQueue参数按值。 这意味着,当你给他们打电话,比如在这一行:

processArrival(newEvent, inFile, eventList, printQueue);

副本 eventListprintQueue的提出和通过进入processArrival功能。 所述processArrival功能然后在这些副本进行操作,和原始数据不会被修改。 具体而言,这意味着原来eventList将永远不会有从它删除的任何项目,因此它永远不会是空的-它只是不断尝试一遍又一遍的处理第一个事件。

解决的办法是通过引用来传递这些参数。 即定义改变processArrival

void processArrival(int *newEvent, ifstream &inFile, list<int>& eventList, queue<int>& printQueue)

注意&我以前插入字符eventListprintQueue 。 这些原因提到原始数据,而不是原来的数据的副本,要传递到所述processArival功能。 这意味着processArrival将直接对原始数据,你想让它来操作。 不要忘了做相应的改变以processDeparture为好。

分类:C# 时间:2015-03-15 人气:0
本文关键词: C#,队列
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.231 (s). 10 q(s)