# Thread: Queue Project Problem

1. ## Queue Project Problem

Hey guys I have yet another project. This ones focus is to get comfortable using queues. My problem is how should i store the rider data into the queue, such as should i use get() or what, also what type of queue would it be..string, or int...Can I put all 3 parts of the rider day in the same spot in the queue and if so how would i access each one independently? Here is what the project entails.
Project:

Geek Faire is an amusement park that caters to technologically-oriented
individuals. To ride one particular ride, The Touring Machine, customers
arrive with a fixed number of tickets and are placed at the end of the
line. Upon reaching the front of the line they pay and enter the
ride. Only one person can ride at a time, and a single ride costs one
ticket. The customer at the front of the line rides and completes the
ride one time unit later. New customers may arrive during this time unit.
A customer who just completed a ride and has more tickets is placed at
the end of the line after the new customers. Upon running out of tickets
the customer exits the ride. Your program will calculate the time unit
during which each customer exits the ride.

INPUT FORMAT:

Input will come from a file called "riders.dat". This file will contain
one or more lines of the form

N E T

N, E and T are separated by a single blank space. N is the last name of
the rider, T is the number of tickets they have and E is the time unit
during which they enter the line. N is an alphabetic string with no
embedded whitespace, E is a non-negative integer and T will be an integer
greater than 0. Riders are guaranteed to be ordered by entry time in the
input file. The end of input is indicated by a line containing "END 0 0".

OUTPUT FORMAT:

Output will be written to a file called "riders.out". Each line of
output will indicate the time the customer exits the ride. Lines will
be of the form

N E

where N is the last name of the rider and E is the time unit during
which they exit the ride. N and E are separated by a single blank
space.

EXAMPLE INPUT:

Hopper 2 1
Torvalds 3 10
Jobs 8 4
Gates 100 100
END 0 0

EXAMPLE OUTPUT:

Hopper 3
Jobs 16
Torvalds 17
Gates 200

2. I'd make it a queue of customer objects. A class/struct such as:
Code:
```struct customer
{
std::string name;
int entry_time;
int num_tickets;
};```
You can read the data from the file using >>:
Code:
```customer temp;
ifstream file("riders.dat");
file >> temp.name >> temp.entry_time >> temp.num_tickets;```
If you wanted to get fancy you could overload the >> operator for the customer object which would simplify the read to just:
Code:
`file >> temp;`
You store the struct into the queue using the basic queue operations such as push/pop. Is this an STL queue container we are talking about here?

3. how about without structs just writing everything in main...can i read 3 things into 1 spot on the queue? Yes this is an STL container we're talking about. I know how to do the project just am unsure how to hold all 3 parts of the data into the same queue because some are datatype int and the other is a string.

4. If you are at the level of using STL containers and learning concepts such as queue, structs and functions should not be too much.
The simplest way to put all the required data in the queue is using a struct.

Or else you might convert everything into a string and store that. And if you want to access and modify some value, you'll need to take the string apart again, convert it into an int to do the operation, then convert it back and put together again. Does that sound easier?

5. that makes sense but i mean i kinda know structs but not really and i mean then what data type would my queue be if i used structs? Would i then be able to access each part of the struct individually.In hk_mp5kpdw's example I would only need to create a tmp of the type customer so that i can read the list of names and data into the queue, then when i want to access them like when the customer goes on the ride take 1 ticket away i would do tmp.num_tickets-1? but wouldn't everything in the queue be tmp.variable name? The way the program will work as I have planned is this. There is one queue called arrivals and simply the infile will read the data into the queue, then at the correct time all the people with that time will move into another queue named line at which point 1 ticket will be taken away. Time will be incremented 1 and the first person on the line queue will be checked to see if he has another ticket, if not the last name and time value will be written to the out file, if he does, then all the people from the arrivals queue with the new time will be put into line, then the person that had a ticket left will go at the end of this line, and the program will go until both queues are empty. Only one person can ride the ride at a time. Thats what i have planned to do but whats holding me up is how i am going to store a string, and two ints as a package into a queue and access the ints and change them.

6. Code:
```struct Rider
{
std::string name;
int tickets, arrival;
};

std::queue<Rider> myQueue;

//goes on a ride:
Rider onTheRide = myQueue.front();
myQueue.pop();
onTheRide.tickets--;

//if tickets left, back in the queue
myQueue.push(onTheRide);```
Something on the line.
At first you'll probably need to put the Riders in a vector or list and sort them according to the arrival time.
Then set up a loop, representing each unit of time.
Check if someone should be added to the queue this time.
Check if there is someone who has been riding and add him to the queue if he has tickets left.
If he doesn't have any tickets, print that he has finished.
Pop the first one in the queue, if any, to a ride.

7. Am i just putting the struct part in my main.cpp before the int main() part? BTW thanks for the code as an example i'm not doing it that way really but can use some of the code like Rider onTheRide so thank you for the example to help me see easier what you mean.

8. Yes, the struct goes before the main.

By the way, your expected input seems to be wrong. Here's a list of who comes off a ride at a given time and how many tickets they have left:
Code:
```1: END, tickets: 0
2: END, tickets: 0
3: Hopper, tickets: 0
4: Torvalds, tickets: 9
5: Torvalds, tickets: 8
6: Torvalds, tickets: 7
7: Torvalds, tickets: 6
8: Torvalds, tickets: 5
9: Jobs, tickets: 3
10: Torvalds, tickets: 4
11: Jobs, tickets: 2
12: Torvalds, tickets: 3
13: Jobs, tickets: 1
14: Torvalds, tickets: 2
15: Jobs, tickets: 0
16: Torvalds, tickets: 1
17: Torvalds, tickets: 0```

9. ok i coded some and where i'm at is copying the customers with the same time arrival as that of the clock into the line queue. heres my code any suggestions would be helpful.
Code:
```#include <iostream>
#include <fstream>
#include <string>

using namespace std;

//this is a struct named Rider that will be used to store all the data of a
//rider on the fair ride, this makes it easier so that I can make a queue of
//type rider instead of multiple queues for each data type of data
struct rider
{
//variable for last name of rider
string lastName;

//variable for number of tickets the rider has
int tickets;

//variable for the arrival time of the rider
int arrival;
};

int main()
{
//variable used to count the ticket
int tickets;

//variable used to keep time
int clock;

//tmp variable used in loops as counter
int i;

//queue that the information from the infile gets stored into
queue<rider> arrivals;

//queue that the riders with the correct clock time get put into
queue<rider> line;

//string that makes it easier to remember the name of the file to open
//to read from
string  inFileName = "riders.dat";

//string that makes it easier to remember the name of the file to open
//to write to
string  outFileName = "riders.out";

//file read from
ifstream inFile;

//file write to
ofstream outFile;

//opens the file to read from
inFile.open(inFileName.c_str());

//opens the file to write to
outFile.open(outFileName.c_str());

//while the infile can be read from
while(inFile)
{

//creates customer of the struct rider;
rider customer;

//it will loop and read from the inFile data while the customer data
//is not equal to END 0 0
while(lastName != 'END' && tickets != 0 && arrivals != 0)
{
//here the file will place the correct data for each customer into
//the correct variables
inFile >> customer.lastName >> customer.tickets >> customer.arrivals;

//after the customer in that particular read is done putting it in the
//correct variables the customer gets pushed ito arrivals queue
arrivals.push(customer);
}

//once all the customers are read from the inFile and put into the arrivals
//queue the program and clock will have to be run where this data will be
//processed. For the processing part of the program, it will run while
//the queues arrivals and line are not empty, therefore they will stop
//running when they become empty.
while(arrivals.empty() != true && line.empty() != true)
{

//closes the infile
inFile.close();

//closes the outfile
outFile.close();

//signals ok to the os
return 0;
};```

10. Not bad. I wouldn't use a queue for putting the input into, because it would be better if you could sort the container.

What I used for that was a list - as it can be sorted and it is easy to treat its beginning as a queue.
If you use a list, you'll need to overload the < operator for Riders to be able to use the list sort method. The prototype is:
Code:
`bool operator< (const Rider& a, const Rider& b);`
Code:
`while(arrivals.empty() != true && line.empty() != true)`
This condition may be wrong. It says to keep looping while there is something in both queues. You may have meant: keep looping while there is something in either queue.
And even then the condition may be wrong wrong. If a person is taking a ride, he needn't be in either queue (the last person spends all the time riding).

Popular pages Recent additions