数据结构 队列
银行排队系统实现
功能要求:
(1) 客户进入排队系统;
(2) 客户离开;
(3) 查询当前客户前面还有几人;
(4) 查询截至目前总共办理多少客户。
输出要求:每进行一次操作后,输出当前排队成员情况。
算法实现
首先创建一个空队列即银行排队队列,再向其中执行插入,删除,查询等操作。在执行插入操作时要判断队列是否已达最大长度,否则不能插入。在删除时要判断队列是否为空,否则不能执行删除操作。删除以后若队列为空,则需要将队尾指向对头。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
//define the structure node
int m = 0;
typedef int Status;
typedef int QElemType;
typedef struct queue//结点结构
{
int value;
struct queue* next;
}Queue, *QueuePtr;
typedef struct linkqueue
{
Queue *front;//头指针
Queue *tail;//尾指针
}LinkQueue;
#define QUEUE_LEN sizeof(Queue)
int initQueue(LinkQueue*);//创建一个队列
int EmptyQueue(LinkQueue*);//判断队列是否为控
int enterQueue(LinkQueue*, int value);//插入元素value为Q的新的队尾元素
int deQueue(LinkQueue*);//删除元素
int printQueue(LinkQueue*);//输出队列
int Query(LinkQueue*, int);//查询元素myNum在队列中的位置
#include<stdio.h>
#include<stdlib.h>
int initQueue(LinkQueue* Q)//构造一个空队列Q
{
printf("Init a queue ......\n");
if (!(Q->front = Q->tail = (Queue*)malloc(QUEUE_LEN)))
{
printf("ERROR:Malloc Error !\n");
return ERROR;
}
Q->front->next = NULL;
return OK;
}
int enterQueue(LinkQueue* Q, int enterValue)//插入元素enterValue为Q的新的队尾元素
{
Queue* tmpNode = NULL;
if (!(tmpNode = (Queue*)malloc(QUEUE_LEN)))
{
printf("ERROR:Malloc Error !\n");
return ERROR;
}
tmpNode->value = enterValue;
tmpNode->next = NULL;
Q->tail->next = tmpNode;
Q->tail = tmpNode;
}
int EmptyQueue(LinkQueue *Q) //若队列Q为空,返回TRUE,否则返回FALSE
{
if (Q->front==Q->tail)
return TRUE;
else
return FALSE;
}
int printQueue(LinkQueue* Q)//将队列中每个元素输出
{
Queue* tmpNode = NULL;
tmpNode = Q->front->next;
if (NULL == tmpNode)
{
printf("无人排队\n");
return ERROR;
}
while (tmpNode != Q->tail)
{
printf("%d ", tmpNode->value);
tmpNode = tmpNode->next;
}
printf("%d\n", Q->tail->value);
}
int deQueue(LinkQueue*Q, QElemType *e)//若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR
{
QueuePtr p;
if (EmptyQueue(Q))
{
printf("无人离开\n");
return ERROR;
}
p = Q->front->next;
*e = p->value;
Q->front->next = p->next;
m++;
if (Q->tail == p)//如果队列中只有一个元素
Q->tail = Q->front;//此时应当让队尾指针指向队头,否则可能将队尾指针释放掉
free(p);
return OK;
}
int Query(LinkQueue* Q, int myNum)//查询元素myNum在队列中的位置
{
int numOfMan = 0;
if (EmptyQueue(Q))
{
printf("无人排队\n");
return ERROR;
}
else if (myNum==Q->front->value==Q->tail->value)
{
return ERROR;
}
else if (myNum > Q->tail->value || myNum < Q->front->value)
{
printf("对不起,您输入了一个错误的号码\n");
return ERROR;
}
else
{
numOfMan = myNum -( Q->front->next->value);
return numOfMan;
}
}
#include<stdio.h>
#include<string.h>
static int bankNumber = 0;
static int totalNumber = 0;
int stopBank();
int startBank();
int flag = 1;
int main()
{
int choice = 0;
int d;
int num = 0;
LinkQueue Q;
initQueue(&Q);
while (1)
{
printf("\n\n#########银行排队系统 #############\n");
printf("### 1:客户进入排队系统; \n");
printf("### 2:客户离开银行 \n");
printf("### 3:查询当前客户前面还有几人 \n");
printf("### 4:查询截止目前总共办理多少客户 \n");
printf("### 5:EXIT \n");
printf(" 请选择[1-5]: ");
scanf_s("%d", &choice);
switch (choice)
{
case 1:
if (flag)
{
bankNumber++;
enterQueue(&Q, bankNumber);
totalNumber++;
printf("你的等待号码数字 %d\n", bankNumber);
printf("%d 人在您之前,请稍等\n", Query(&Q, bankNumber));
printf("当前的排队成员情况为:"); printQueue(&Q);
break;
}
else
{
printf(" 停止申请号码\n");
printf("当前的排队成员情况为:"); printQueue(&Q);
break;
}
case 2:
deQueue(&Q,&d);
printf("您(%d号)已离开银行 ....\n", d);
totalNumber--;
printf("当前的排队成员情况为:"); printQueue(&Q);
break;
case 3:
printf("请输入您的号码:\n");
scanf_s("%d", &num);
printf("%d 人在您之前,请稍等\n", Query(&Q, num));
printf("当前的排队成员情况为:"); printQueue(&Q);
break;
case 4:
printf("截止目前总共办理%d个客户\n", m);
printf("当前的排队成员情况为:"); printQueue(&Q);
break;
case 5:
exit(0);
break;
default:
break;
}
}
return OK;
}
int stopBank()
{
flag = 0;
return 0;
}
int startBank()
{
flag = 1;
return 0;
}
运行结果
1、客户进入排队系统
2、客户离开银行
3、查询当前客户前面还有几人
4、查询截止目前总共办理多少客户