银行排队系统

【问题描述】假设银行只有2个窗口对外营业,顾客到银行办理业务,首先要取一个顺序号,然后排队等待叫号。被叫到号的顾客到柜台接受服务,服务完毕后离开。到了下班时间不再接收新来的顾客。顾客分为普通顾客和VIP顾客,VIP顾客有优先权,即可以先得到服务。编一算法模拟银行的每个窗口一天各有多少顾客接受了服务,其中有多少个VIP顾客;并按逆序输出接受服务的普通顾客和VIP顾客的顺序号。
【问题分析】
顾客到银行办理业务,必须按照先来先得到服务的原则,因此可以把顾客信息用一个队列来存储,顾客到达后先取号,然后进入队列(插入队尾)等待;被叫到号的顾客接受服务,然后离开(队头元素出列);银行下班后不再接收新来的顾客,即将队列中的元素依次出队列。VIP顾客可以优先得到服务,即可以把VIP顾客单独放在一个队列中,当顾客需要接受服务时 ,首先判断VIP队列是否为空,如不为空,则VIP队列的第一个顾客接受服务;当为空时,则普通队列的第一个顾客接受服务。到达银行的顾客的顺序号随机产生(1-100之间)。顾客的等级也可随机产生(比如;1表示VIP顾客;0表示普通顾客)。设置命令:A表示顾客到达银行;D表示顾客离开银行;P表示下班不再接收新顾客。为了逆序输出已接受服务的顾客顺序号,可以设置一个栈,在顾客接受完服务后,将顾客的顺序号存入栈中,待下班后,依次取出栈中元素并输出,即为所求。
【实现提示】
本题采用2个带头结点的链队列和一个顺序栈作为存储结构。
输入设计:当输入命令A时,进行入队操作;当输入D时,进行出队操作;当输入P时,如果排队队列不空,则依次删除所有元素。在删除元素的过程中,把删除的元素同时入栈,并计数。
输出设计:输出进入银行排队的总人数和逆序输出排队的顾客顺序号。
说明:可以不按“实现提示”做,由自己任意发挥。

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct node
{
    ///结点构造
    int date;///顾客顺序号
    struct node *next;///指针域
} LinkQnode;
typedef struct
{
    ///链队列结构
    LinkQnode *front;///队头指针
    LinkQnode *rear;///队队尾指针
} LinkQueue;
typedef struct/**顺序栈结构**/
{
    int *base;
    int *top;
    int Stacksize;
} SeqStack;
void InitLinkQueue(LinkQueue *Q1, LinkQueue *Q2)
{
    Q1->front = (LinkQnode *)malloc(sizeof(LinkQnode));
    Q1->rear = Q1->front;
    Q1->front->next = NULL;
    Q2->front = (LinkQnode *)malloc(sizeof(LinkQnode));
    Q2->rear = Q2->front;
    Q2->front->next = NULL;
}
void InitStack(SeqStack *S)
{
    S->base = (int *)malloc(100 * sizeof(int));
    if(!S->base)
        printf("空间已满\n");
    else
    {
        S->top = S->base;
        S->Stacksize = 100;
    }
}
int EnLinkQueue(LinkQueue *Q, int x)
{
    LinkQnode *Newnode;
    Newnode = (LinkQnode *)malloc(sizeof(LinkQnode));
    if(Newnode != NULL)
    {
        Newnode->date = x;
        Newnode->next = NULL;
        Q->rear->next = Newnode;
        Q->rear = Newnode;
        printf("序号为%d的顾客进入\n", Q->rear->date);
        return 1;
    }
    else
        return 0;
}
int DeLinkQueue(LinkQueue *Q, int *x)
{
    LinkQnode *p;
    if(Q->front == Q->rear)
        return 0;
    p = Q->front->next;
    Q->front->next = p->next;
    if(Q->rear == p)
    {
        Q->rear = Q->front;
    }
    *x = p->date;
    free(p);
    return 1;
}
int Push(SeqStack *S, int x)
{
    if(S->top - S->base == S->Stacksize)
    {
        S->base = (int *)realloc(S->base, (S->Stacksize + 10) * sizeof(int));
        if(S->base == NULL)
            return 0;
        S->top = S->base + S->Stacksize;
        S->Stacksize = S->Stacksize + 10;
    }
    *S->top = x;
    S->top++;
    return 1;
}
int IsLQEmpty(LinkQueue *Q)
{
    if(Q->front == Q->rear)
        return 1;
    else
        return 0;
}
int IsEmpty(SeqStack *S)
{
    if(S->top == S->base)
        return 1;
    else
        return 0;
}
int Pop(SeqStack *S, int *x)
{
    if(S->top == S->base)
        return 0;
    else
    {
        S->top--;
        *x = *S->top;
        return 1;
    }
}
void Process(LinkQueue *Q1, LinkQueue *Q2, SeqStack *S)
{
    char ch;
    int flag, sum = 0, ans = 1, cnt = 0;
    int num1=0,num2=0,num=0;
    printf("------------------银行排队系统模拟------------------\n");
    printf("  A--表示顾客到达\n  D--表示顾客离开\n  P--表示停止顾客进入\n");
    printf("1表示顾客属于VIP顾客,0表示顾客属于普通顾客\n");
    printf("请输入:A/D/P及0/1\n");
    flag = 1;
    while(flag)
    {
        cin >> ch;
        switch(ch)
        {
        case 'A':
            cin >> cnt;
            if(ans <= 2)
            {
                num1++;
                num2++;
                num++;
                if(cnt == 1)
                {
                    EnLinkQueue(Q1, num1);
                    Push(S, num);
                    printf("顾客号为%d的VIP顾客正在接受服务\n", num1);
                    //break;
                }
                else if(cnt == 0)
                {
                    EnLinkQueue(Q2, num2);
                    Push(S, num1);
                    printf("顾客号为%d的普通顾客正在接受服务\n", num2);
                    //break;
                }
                ans++;
                break;
            }
            else if(ans > 2)
            {
                if(cnt == 0)
                {
                    num++;
                    EnLinkQueue(Q2, num);
                    printf("请顺序号为%d的普通顾客等待\n", num);
                    //break;
                }
                else if(cnt == 1)
                {
                    num++;
                    EnLinkQueue(Q1, num);
                    printf("请顺序号为%d的VIP顾客等待\n", num);
                    //break;
                }
            }
            break;
        case 'D':
            if(!IsLQEmpty(Q1))//
            {
                DeLinkQueue(Q1,&num);
                sum=sum+1;///已接受服务的顾客数
                printf("请序号为%d的VIP顾客离开\n",num);
                Push(S,num);
            }
            else if(IsLQEmpty(Q1)&&(!IsLQEmpty(Q2)))
            {
                DeLinkQueue(Q2,&num);
                sum=sum+1;
                printf("请序号为%d的普通顾客离开\n",num);
            }
            else if(IsLQEmpty(Q1)&&IsLQEmpty(Q2))
            {
                printf("无顾客排队\n");
            }
            break;
        case 'P':
            printf("停止顾客进入\n");
            printf("还在排队的顾客有:\n");
            while(!IsLQEmpty(Q1))
            {
                DeLinkQueue(Q1,&num);
                printf("还在排队的VIP顾客号%d\n",num);
                sum=sum+1;
                Push(S,num);
            }
            while(!IsLQEmpty(Q2))
            {
                DeLinkQueue(Q2,&num);
                printf("还在排队的普通顾客号%d\n",num);
                sum=sum+1;
                Push(S,num);
            }
            flag=0;
            break;
        }
    }
    printf("到达银行的顾客人数为%d\n",sum);
    while(!IsEmpty(S))
    {
        Pop(S,&num);
        printf("第%d位顾客,序号为%d\n",sum,num);
        sum--;
    }

}
int main()
{
    LinkQueue *Q1, *Q2;
    SeqStack *S;
    Q1 = (LinkQueue *)malloc(sizeof(LinkQueue));
    Q2 = (LinkQueue *)malloc(sizeof(LinkQueue));
    S = (SeqStack *)malloc(sizeof(SeqStack));
    InitLinkQueue(Q1, Q2);
    InitStack(S);
    Process(Q1, Q2, S);
    return 0;
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐