银行排队系统

【问题描述】假设银行只有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;}elsereturn 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;elsereturn 0;
}
int IsEmpty(SeqStack *S)
{if(S->top == S->base)return 1;elsereturn 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;
}

数据结构实验二(C语言):银行排队系统相关推荐

  1. 数据结构实验二——队列(银行叫号系统)

    一.实验目的 (1)掌握队列的链式存储结构 (2)掌握队列的基本操作,并能进行应用实践 (3)使用C/C++语言和队列实现"银行叫号系统"专题 二.实验任务 设计一个控制台程序,模 ...

  2. c 语言银行排队系统,C++实现银行排队系统

    #include #include #include int cnt=0; //当日客流量 int sum=0; //当日客户排队总时间 typedef struct pnode{ int numbe ...

  3. 用c语言银行队列系统,C语言学习之用队列实现银行排队系统

    队列操作的接口:http://blog..net/qlx846852708/article/details/43666927 数据结构C语言实现:http://blog..net/qlx8468527 ...

  4. 数据结构大作业——银行排队系统

    数据结构大作业--银行排队系统 离散事件模拟--银行业务处理 题目分析 声明部分 辅助函数 初始化窗口节点 创建顾客节点 比较四个窗口的排队人数 输出离开顾客的信息 主要函数 完整的头文件代码 离散事 ...

  5. c语言编程银行排队系统,C语言_课程设计银行排队系统.doc

    C语言_课程设计银行排队系统 #include #include #include #include #include #define n 3 int vip1=0; int y,z; float s ...

  6. QT4.7下的UI图形界面设计用例——银行排队系统

    这里写自定义目录标题 QT4.7的UI界面设计功能 效果展示 文件机制 UI功能详述 信号与槽机制(非常重要) 添加新文件 顶部菜单栏设定 菜单界面与点击下拉栏选项后界面切换 弹窗显示 主界面与弹窗界 ...

  7. 数据库实验二 SQL语言

    实验二 SQL语言 实验目的 熟悉并掌握创建表,插入记录,查询记录,删除记录,修改记录. 创建索引,删除索引. 创建视图,使用视图,删除视图. 实验内容 现有一个单位内部的小型图书借阅系统,假设每本图 ...

  8. 银行排队系统的设计与实现(源代码)

    (该系统在DEV编译器中不出现问题,在VC6.0中,要注意这样子设置就可以了,在"工程"->"设置"->"C/C++"-> ...

  9. matlab语言实验二,实验二 MATLAB语言基础

    实验二 MATLAB 语言基础 一.实验目的 基本掌握 MATLAB 向量.矩阵.数组的生成及其基本运算(区分数组运算和矩阵运算).常用的数学函数.了解字符串的操作. 二.实验内容 (1) 向量的生成 ...

最新文章

  1. UNICODE使用的一些知识和技巧
  2. docker-engine安装好了,下一步该做什么?
  3. mybatis基本增删改查、缓存,延迟加载以及别名的配置
  4. 【Hibernate】hibernate实体关系映射——单边的多对多关系
  5. Python 生成器与列表解析
  6. Mysql中DATE_SUB 使用方法结合查询一天内,一周内,一月内的信息实例讲解
  7. 解决设置了background-size: cover; 但是图片在ios下显示不完整的问题
  8. 在linux下做源码免杀,Cobaltstrike免杀从源码级到落地思维转变
  9. JS中Promise函数then的奥秘探究
  10. 第七届蓝桥杯javaB组真题解析-抽签(第五题)
  11. 最长XXX子序列(什么都好啦)
  12. 《C++Primer》14、15章
  13. 一张图看懂你与AI的优劣势
  14. 10、网友问答之串口字节方式传递单精度数--------labview宝典
  15. php net-snmp trap,什么是正确的snmptrap命令格式?
  16. 中国第一政经博客 数学
  17. 中级会计 科学计算机,听说中级会计机考系统计算器你还不会使用?还不快点关注...
  18. 什么是期权股权?什么是期权股权原始股?
  19. java font 字体加粗_java字体设置,包括大小,颜色,加粗,下划线,对齐,斜体的设置...
  20. linux 进程调度cfg,选择Linux I / O调度程序

热门文章

  1. Revit开发小功能集合
  2. 平凡前端之路_03.HTML5的音频视频多媒体
  3. 如何在virtualbox上搭建私有云桌面
  4. 前端开发示范(H5+CS3)
  5. OpenWrt下通过EC20 R2.0 4G模块实现qmi拨号上网
  6. 利用 Ophis 编写 Commodore 64 programs PRG 程序(一)
  7. 如何开始使用“针式PKM”软件
  8. uni-app 苹果桌面icon角标清除方法
  9. C#实现文件上传下载
  10. 情感日记:为什么我的眼里常含泪水