关于银行排队叫号系统算法的实现

时间:2022-06-09 21:33:14
麻烦大家帮我解决下面一道题
先谢谢啦!

关于去银行取钱的取号排队取钱的首先取号然后排队进行办理业务,遵循先取号先办理业务
要求编写实现程序,使用户按先到先办理业务的规则获取号码,同时提示当前要等待的人数有多少,编写连接队的操作函数,实现银行银行排队叫号算法
1.采用循环队列
2.客户每按依稀取号服务,则调用一次入队函数,并给出该客户的队列号,同时统计该客户后面等待的人数
3.银行柜台服务人员每叫一次号,则调用一次出队函数,读取对头元素,提示到第几个 顾客办理业务

6 个解决方案

#1


很简单,像作业题。
1、2、3已经把怎么实现的思路说得很清楚了,照着做就行了。

#2



很像作业帖哦!
会锁定的!

建立数组,利用指针……

#3



//天啊,我太菜了,写得好烂,哎
//下面为模版类
#ifndef QUEUE_CLASS_H
#define QUEUE_CLASS_H

template<class T>
class Queue
{
public:
Queue();
~Queue();
Queue(const T &que);
Queue& operator=(const Queue &que);

void copy(Queue<T> &queue1, const Queue<T> &queue2);
void destroy();
int size();
int EnQueue(const T &a);
T next();
T DeQueue();
private:
int i;
T* head;
T* end;
};

template<class T>
Queue<T>::Queue()
{
head = new T();
head->next = NULL;
end = head;
}

template<class T>
int Queue<T>::size()
{
int size = 0;
T* p = head;

while ((p = p->next) != end)
++size;
return ++size;
}

template<class T>
int Queue<T>::EnQueue(const T &a)
{
T *tmp;
tmp = new T(a);
end->next = tmp;
end = tmp;
end->next = head->next;

return size() - 1;
}

template<class T>
T Queue<T>::DeQueue()
{
if (head->next == NULL)
{
return *head;
}
T *tmp = head->next;
head->next = tmp->next;
T t(*tmp);
free(tmp);
return t;
}

template<class T>
void Queue<T>::destroy()
{
T *p = head->next;

while (p != end)
{
head->next = p->next;
free(p);
p = head->next;
}
free(end);
free(head);
}

template<class T>
Queue<T>::~Queue()
{
destroy();
}

template<class T>
void Queue<T>::copy(Queue<T> &queue1, const Queue<T> &queue2)
{
queue1.head = new T;
queue1.head-> = NULL;
queue1.end = head;

T *p = queue2.head;
T *tmp;

while (p != queue2.end)
{
tmp = new T(*p);
queue1.end->next = tmp;
tmp->next = queue1.head->next;
queue1.end = queue1.head->next;
}
tmp = new T(*queue2.end);
queue1.end->next = tmp;
tmp->next = queue1.head->next;
queue1.end = tmp;
}

template<class T>
Queue<T>& Queue<T>::operator =(const Queue<T> &que)
{
destroy();
copy(*this, que);

}

template<class T>
Queue<T>::Queue(const T &que)
{
copy(*this, que);
}

template<class T>
T Queue<T>::next()
{
if (size() >= 2)
return *head->next;
else
return *head;
}
#endif

//主函数
#include <iostream>
#include "Queue.h"

struct People
{
int i;
struct People *next;
};

int main()
{
Queue<People> queue;

std::cout << "\t\t\t\t银行排队叫号系统算法" << std::endl;

for (int i = 1; i <= 10; ++i)
{
People p;
p.i = i;
std::cout << "你的ID为" << i << "你前面目前还有" << queue.EnQueue(p) << std::endl;
}

std::cout << "当前正在处理号码:" << queue.DeQueue().i << std::endl;
std::cout << "下一位ID:" << queue.next().i << "请做准备" << std::endl;

system("pause");
return 0;
}

#4


1.采用循环队列 
2.客户每按依稀取号服务,则调用一次入队函数,并给出该客户的队列号,同时统计该客户后面等待的人数 
3.银行柜台服务人员每叫一次号,则调用一次出队函数,读取对头元素,提示到第几个 顾客办理业务


楼主,队列还不会写吗?入队,出队,都是基本的数据结构。

#5


我写了,但运行以后不对啊!也调了好几次

#6


引用 5 楼 mafei003 的回复:
我写了,但运行以后不对啊!也调了好几次

你可以把代码贴上来,大家帮你看啊

#1


很简单,像作业题。
1、2、3已经把怎么实现的思路说得很清楚了,照着做就行了。

#2



很像作业帖哦!
会锁定的!

建立数组,利用指针……

#3



//天啊,我太菜了,写得好烂,哎
//下面为模版类
#ifndef QUEUE_CLASS_H
#define QUEUE_CLASS_H

template<class T>
class Queue
{
public:
Queue();
~Queue();
Queue(const T &que);
Queue& operator=(const Queue &que);

void copy(Queue<T> &queue1, const Queue<T> &queue2);
void destroy();
int size();
int EnQueue(const T &a);
T next();
T DeQueue();
private:
int i;
T* head;
T* end;
};

template<class T>
Queue<T>::Queue()
{
head = new T();
head->next = NULL;
end = head;
}

template<class T>
int Queue<T>::size()
{
int size = 0;
T* p = head;

while ((p = p->next) != end)
++size;
return ++size;
}

template<class T>
int Queue<T>::EnQueue(const T &a)
{
T *tmp;
tmp = new T(a);
end->next = tmp;
end = tmp;
end->next = head->next;

return size() - 1;
}

template<class T>
T Queue<T>::DeQueue()
{
if (head->next == NULL)
{
return *head;
}
T *tmp = head->next;
head->next = tmp->next;
T t(*tmp);
free(tmp);
return t;
}

template<class T>
void Queue<T>::destroy()
{
T *p = head->next;

while (p != end)
{
head->next = p->next;
free(p);
p = head->next;
}
free(end);
free(head);
}

template<class T>
Queue<T>::~Queue()
{
destroy();
}

template<class T>
void Queue<T>::copy(Queue<T> &queue1, const Queue<T> &queue2)
{
queue1.head = new T;
queue1.head-> = NULL;
queue1.end = head;

T *p = queue2.head;
T *tmp;

while (p != queue2.end)
{
tmp = new T(*p);
queue1.end->next = tmp;
tmp->next = queue1.head->next;
queue1.end = queue1.head->next;
}
tmp = new T(*queue2.end);
queue1.end->next = tmp;
tmp->next = queue1.head->next;
queue1.end = tmp;
}

template<class T>
Queue<T>& Queue<T>::operator =(const Queue<T> &que)
{
destroy();
copy(*this, que);

}

template<class T>
Queue<T>::Queue(const T &que)
{
copy(*this, que);
}

template<class T>
T Queue<T>::next()
{
if (size() >= 2)
return *head->next;
else
return *head;
}
#endif

//主函数
#include <iostream>
#include "Queue.h"

struct People
{
int i;
struct People *next;
};

int main()
{
Queue<People> queue;

std::cout << "\t\t\t\t银行排队叫号系统算法" << std::endl;

for (int i = 1; i <= 10; ++i)
{
People p;
p.i = i;
std::cout << "你的ID为" << i << "你前面目前还有" << queue.EnQueue(p) << std::endl;
}

std::cout << "当前正在处理号码:" << queue.DeQueue().i << std::endl;
std::cout << "下一位ID:" << queue.next().i << "请做准备" << std::endl;

system("pause");
return 0;
}

#4


1.采用循环队列 
2.客户每按依稀取号服务,则调用一次入队函数,并给出该客户的队列号,同时统计该客户后面等待的人数 
3.银行柜台服务人员每叫一次号,则调用一次出队函数,读取对头元素,提示到第几个 顾客办理业务


楼主,队列还不会写吗?入队,出队,都是基本的数据结构。

#5


我写了,但运行以后不对啊!也调了好几次

#6


引用 5 楼 mafei003 的回复:
我写了,但运行以后不对啊!也调了好几次

你可以把代码贴上来,大家帮你看啊