题目
疑惑
逻辑思路理不清楚,希望能指导一下,帮我理清楚一下逻辑思路。
我的解答思路和尝试过的方法
构建2个对象,一个是客户对象(属性:客户ID,客户进入时间,客户业务所需要时间)
一个是ATM队列对象(属性:一些队列的基本方法,我是以客户对象作为一个节点)
详细代码:
//
#include <iostream>
using namespace std;
class Client {
public:
int NO, enter_Time, spend_Time, leave_Time;
friend class Atm_Queue;
Client(int x = 0, int y = 0, int z = 0) {
NO = x, enter_Time = y, spend_Time = z, leave_Time = 0;
}
};
class Atm_Queue {
public:
int size, rear, front, capacity;
int leaveTime;
//Client client;
Client* array;
bool isEmpty() {
if (size== 0) {
return true;
}
else { return false; }
}
bool isFull() {
if (size == capacity) {
return true;
}
else { return false; }
}
int getsize() {
return size;
}
bool isElement() {
if (!isEmpty()) {
return true;
}
else
{
return false;
}
}
Atm_Queue(int x=10) {
capacity = x;
size = 0;
front = 1;
rear = 0;
leaveTime = 0;
array = new Client[x];
}
void enterAtm_Queue(Client *c) {
size++;
rear = rear + 1 % capacity;
array[rear].enter_Time = c->enter_Time;
array[rear].spend_Time = c->spend_Time;
cout <<"enterqueue: " << array[rear].enter_Time << " " << array[rear].spend_Time<< " "<<c->NO<<endl;
}
void pushAtm_Queue() {
if (isEmpty())
cout << "error" << endl;
else {
size--;
front = (front + 1) % capacity;
}
}
int getfront() {
static int i = 0;
if (i==0)
{
array[front].leave_Time = array[front].spend_Time + array[front].enter_Time + leaveTime;
leaveTime = array[front].leave_Time;
i++;
}
else
{
leaveTime = array[front].spend_Time + leaveTime;
}
return leaveTime;
}
};
class USER {
public: Client *array;
};
class ATM {
public:
Atm_Queue* Atmarray;
};
//是否需要排队
bool isLineUp(ATM atm,int User_enterTime) {
if (( atm.Atmarray + 0)->leaveTime>User_enterTime &&(atm.Atmarray + 1)->leaveTime > User_enterTime&& (atm.Atmarray + 2)->leaveTime > User_enterTime
) {
return true;
}
else
{
return false;
}
}
//获取人最少,且ATM编号做少的ATM编号
int MinSizeAtmId(ATM atm) {
int min,minflag;
min = (atm.Atmarray + 0)->getsize();
for (int i = 0; i < 3; i++) {
if (min>(atm.Atmarray + i)->getsize())
{
min = (atm.Atmarray + i)->getsize();
minflag = i;
}
}
return minflag;
}
int main()
{
int n;
cin >> n;
USER user;
ATM atm;
user.array= new Client[n];
atm.Atmarray = new Atm_Queue[3];
for (int i = 0; i < n; i++) {
// 获取数据
(user.array+i)->NO = i + 1;
cin >> (user.array + i)->enter_Time >> (user.array + i)->spend_Time;
/*有人来,是否需要排队*/
//需要排队
if(isLineUp(atm, (user.array + i)->enter_Time)) {
((atm.Atmarray + 0))->enterAtm_Queue((user.array + i));
(user.array + i)->leave_Time = ((atm.Atmarray + 0))->getfront();
continue;
}
//需要不排队
else
{
//第一台ATM机当前没有人,直接用。
if (((atm.Atmarray + 0))->size == 0 && ((atm.Atmarray + 0))->leaveTime < (user.array + i)->enter_Time)
{
((atm.Atmarray + 0))->enterAtm_Queue((user.array + i));
(user.array + i)->leave_Time = ((atm.Atmarray + 0))->getfront();
((atm.Atmarray + 0))->pushAtm_Queue();
continue;
}
//第二台ATM机当前没有人,直接用。
else if (((atm.Atmarray + 1))->size == 0 && ((atm.Atmarray + 1))->leaveTime < (user.array + i)->enter_Time)
{
((atm.Atmarray + 1))->enterAtm_Queue((user.array + i));
(user.array + i)->leave_Time = ((atm.Atmarray + 1))->getfront();
((atm.Atmarray + 1))->pushAtm_Queue();
}
//第三台ATM机当前没有人,直接用。
else if (((atm.Atmarray + 2))->size == 0 && ((atm.Atmarray + 2))->leaveTime < (user.array + i)->enter_Time)
{
((atm.Atmarray + 2))->enterAtm_Queue((user.array + i));
(user.array + i)->leave_Time = ((atm.Atmarray + 2))->getfront();
((atm.Atmarray + 2))->pushAtm_Queue();
}
}
/*****************************************************/
}
}