队列->队列的应用(银行业务模拟)
文字描述
示意图
代码实现
//
// Created by Zhenjie Yu on 2019-04-13.
// #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h> #define DEBUG #define RED "\e[0;31m"
#define L_RED "\e[1;31m"
#define NONE "\e[0m" #ifdef DEBUG
#include <stdarg.h>
#define LOG(args...) _log_(__FILE__, __FUNCTION__, __LINE__, ##args);
static void _log_(const char *file, const char *function, int line, const char * format, ...)
{
char buf[] = {};
va_list list;
va_start(list, format);
// sprintf(buf, "[%s,%s,%d]", file, function, line);
vsprintf(buf+strlen(buf), format, list);
sprintf(buf+strlen(buf), "\n");
va_end(list);
printf(buf);
}
#else
#define LOG
#endif // DEBUG /////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
#define MAXQSIZE 100
typedef struct QElemType{
int ArrivalTime;
int Duration;
}QElemType; typedef struct{
QElemType *base;
int front;
int rear;
}SqQueue;
static int InitQueue(SqQueue *Q);
static int QueueLength(SqQueue Q);
static int EnQueue(SqQueue *Q, QElemType e);
static int DeQueue(SqQueue *Q, QElemType *e);
static int TraverseQueue(SqQueue Q);
static int QueueEmpty(SqQueue Q); //return 0:not empty; -1 empty
static int GetQueueHead(SqQueue Q, QElemType *e); /////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10 typedef struct Event{
int OccurTime; //occur time of event.
int NType; //event type: 0 arrive; 1-4 queue 1-4 apart.
}Event, ElemType; typedef struct LinkList{
ElemType *elem;
int length;
int listsize;
}LinkList;
static int InitList(LinkList *L);
static int ListInsert(LinkList *L, ElemType e, int (*fun)(ElemType e1, ElemType e2));
static int ListDelete(LinkList *L, int locate, ElemType *e);
static int compare(ElemType e1, ElemType e2); // return -1(e1.ocurtime < e2.ocurtime), 0, 1
static int ListTraverse(LinkList L);
static int ListEmpty(LinkList L); //return 0:not empty; -1:empty /////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
typedef LinkList EventList;
EventList ev; //event table
Event en; //event
SqQueue q[+]; //four depart queue of customer
QElemType customer;
int TotalTime = ; //the total time of spend of all custmers
int CustomerNum = ; //the number of custmer
int CloseTime = ;
static int OpenForDay(){
TotalTime = ;
CustomerNum = ;
if(InitList(&ev)<){
LOG("error:init event list error!");
return -;
}
int i = ;
for(i=; i<=; i++){
if(InitQueue(&q[i]) < ){
LOG("error:init queue %d error!", i);
return -;
}
}
en.OccurTime = ;
en.NType = ;
if(ListInsert(&ev, en, compare)<){
LOG("error:insert event(%d,%d) error!", en.OccurTime, en.NType);
return -;
}
} static int Minimum(SqQueue qList[], int start, int end)
{
int i = ;
int ret = start;
for(i=start; i<=end; i++){
if(QueueLength(qList[i]) < QueueLength(qList[ret])){
ret = i;
}
}
return ret;
}
static int CustomerArrived(void){
srand((unsigned)time(NULL));
CustomerNum += ;
int durtime = rand()%+; //1-30
int intertime = rand()%+; //1-5
int t = en.OccurTime + intertime;
int i = ;
Event event;
QElemType qe;
if(t<CloseTime){
//Insert to event list
event.NType = ;
event.OccurTime = t;
if(ListInsert(&ev, event, compare)<){
LOG("error:fail when insert event(%d,%d)!", event.OccurTime, event.NType);
return -;
}
}
i = Minimum(q, , );
qe.ArrivalTime = en.OccurTime;
qe.Duration = durtime;
EnQueue(&q[i], qe);
if(QueueLength(q[i]) == ){
event.OccurTime = en.OccurTime+durtime;
event.NType = i;
if(ListInsert(&ev, event, compare)<){
LOG("error:fail insert (%d,%d) to List", event.OccurTime, event.NType);
return -;
}
}
return ;
} static int CustomerDeparture(void){
int i = en.NType;
Event event;
if(DeQueue(&q[i], &customer)<){
LOG("error:fail when delete from queue %d", i);
return -;
}
TotalTime += (en.OccurTime - customer.ArrivalTime);
if(!QueueEmpty(q[i])){
if(GetQueueHead(q[i], &customer)<){
LOG("error:fail when gethead from queue %d", i);
return -;
}
event.OccurTime = en.OccurTime+customer.Duration;
event.NType = i;
if(ListInsert(&ev, event, compare)<){
LOG("error:fail insert (%d,%d) to evenlist", event.OccurTime, event.NType);
return -;
}
}
return ;
} int main(int argc, char *argv[]){
LOG("利用队列实现银行业务模拟! 营业时间0 - %d", CloseTime);
int timer = ;
if(OpenForDay()<){
return -;
}
while(!ListEmpty(ev)){
timer += ;
if(ListDelete(&ev,,&en)<){
LOG("error:delete event from list error!");
break;
}
if(en.NType == ){
if(CustomerArrived()<){
LOG("error:handle new customer fail!");
break;
}
}else{
if(CustomerDeparture()<){
LOG("error:handle leave customer fail!");
break;
}
}
// if(timer % 20){
LOG("TotalTime=%d, CustomerNum=%d, timer=%d", TotalTime, CustomerNum, timer);
LOG("窗口 1");
TraverseQueue(q[]);
LOG("窗口 2");
TraverseQueue(q[]);
LOG("窗口 3");
TraverseQueue(q[]);
LOG("窗口 4");
TraverseQueue(q[]);
LOG("事件表");
ListTraverse(ev);
LOG("");
// } }
LOG("The Average Time is %f", (float)TotalTime/CustomerNum);
return ;
} /////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
static int InitQueue(SqQueue *Q)
{
Q->base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
if(Q->base == NULL){
return -;
}
Q->front = ;
Q->rear = ;
return ;
} static int QueueLength(SqQueue Q){
return (Q.rear-Q.front+MAXQSIZE) % MAXQSIZE;
} static int EnQueue(SqQueue *Q, QElemType e){
if((Q->rear++MAXQSIZE)%MAXQSIZE == Q->front){
LOG("error: queue full!");
return -;
}else{
Q->base[Q->rear] = e;
Q->rear = (Q->rear++ MAXQSIZE)%MAXQSIZE;
return ;
}
} static int DeQueue(SqQueue *Q, QElemType *e){
if(Q->front == Q->rear){
LOG("error: queue emopty!");
return -;
}else{
*e = Q->base[Q->front];
Q->front = (Q->front + + MAXQSIZE) % MAXQSIZE;
return ;
}
} static int TraverseQueue(SqQueue Q){
int i = Q.front;
do{
if(i == Q.rear){
break;
}
i = (i++MAXQSIZE) % MAXQSIZE;
}while();
return ;
}
//return 0:not empty; -1 empty
static int QueueEmpty(SqQueue Q){
if(Q.front == Q.rear){
return -;
}else{
return ;
}
} static int GetQueueHead(SqQueue Q, QElemType *e)
{
if(QueueEmpty(Q)){
return -;
}
(*e) = Q.base[Q.front];
return ;
} /////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
static int InitList(LinkList *L){
if(L==NULL){
return -;
}
if((L->elem=(ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType))) == NULL){
return -;
}
L->length = ;
L->listsize = LIST_INIT_SIZE;
return ;
} static int ListInsert(LinkList *L, ElemType e, int (*fun)(ElemType e1, ElemType e2)){
int i = ;
int j = ;
if(L->length == L->listsize){
//kuo rong
ElemType *newbase = NULL;
if((newbase=(ElemType*)realloc(L->elem, (L->listsize+LIST_INCREMENT)* sizeof(ElemType))) == NULL){
return -;
}
L->elem = newbase;
L->listsize += LIST_INCREMENT;
}
for(i=; i<L->length; i++){
if(fun(e, L->elem[i])<){
break;
}
}
for(j=L->length; j>=i; j--){
L->elem[j+] = L->elem[j];
}
L->elem[i] = e;
L->length += ;
return ;
} static int ListDelete(LinkList *L, int locate, ElemType *e){
if(locate< || locate>(L->length-) || L->length<){
return -;
}
(*e) = L->elem[locate];
int i = ;
for(i=locate+; i<L->length; i++){
L->elem[i-] = L->elem[i];
}
L->length -= ;
return ;
} static int compare(ElemType e1, ElemType e2){
if(e1.OccurTime < e2.OccurTime){
return -;
}else if(e1.OccurTime == e2.OccurTime){
return ;
}else{
return ;
}
} static int ListTraverse(LinkList L){
int i = ;
for(i=; i<L.length; i++){
LOG("序号%d=(发生时间%d, 事件类型%d)", i, L.elem[i].OccurTime, L.elem[i].NType);
}
} //return 0:not empty; -1:empty
static int ListEmpty(LinkList L){
if(L.length>){
return ;
}else{
return -;
}
}
利用队列实现银行业务模拟
代码运行
/home/lady/CLionProjects/untitled/cmake-build-debug/untitled
利用队列实现银行业务模拟! 营业时间0 - 50
TotalTime=0, CustomerNum=1, timer=1
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间4, 事件类型0)
序号1=(发生时间17, 事件类型1) TotalTime=0, CustomerNum=2, timer=2
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间8, 事件类型0)
序号1=(发生时间17, 事件类型1)
序号2=(发生时间21, 事件类型2) TotalTime=0, CustomerNum=3, timer=3
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间12, 事件类型0)
序号1=(发生时间17, 事件类型1)
序号2=(发生时间21, 事件类型2)
序号3=(发生时间25, 事件类型3) TotalTime=0, CustomerNum=4, timer=4
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间16, 事件类型0)
序号1=(发生时间17, 事件类型1)
序号2=(发生时间21, 事件类型2)
序号3=(发生时间25, 事件类型3)
序号4=(发生时间29, 事件类型4) TotalTime=0, CustomerNum=5, timer=5
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间17, 事件类型1)
序号1=(发生时间20, 事件类型0)
序号2=(发生时间21, 事件类型2)
序号3=(发生时间25, 事件类型3)
序号4=(发生时间29, 事件类型4) TotalTime=17, CustomerNum=5, timer=6
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间20, 事件类型0)
序号1=(发生时间21, 事件类型2)
序号2=(发生时间25, 事件类型3)
序号3=(发生时间29, 事件类型4)
序号4=(发生时间34, 事件类型1) TotalTime=17, CustomerNum=6, timer=7
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间21, 事件类型2)
序号1=(发生时间24, 事件类型0)
序号2=(发生时间25, 事件类型3)
序号3=(发生时间29, 事件类型4)
序号4=(发生时间34, 事件类型1) TotalTime=34, CustomerNum=6, timer=8
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间24, 事件类型0)
序号1=(发生时间25, 事件类型3)
序号2=(发生时间29, 事件类型4)
序号3=(发生时间34, 事件类型1) TotalTime=34, CustomerNum=7, timer=9
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间25, 事件类型3)
序号1=(发生时间28, 事件类型0)
序号2=(发生时间29, 事件类型4)
序号3=(发生时间34, 事件类型1)
序号4=(发生时间41, 事件类型2) TotalTime=51, CustomerNum=7, timer=10
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间28, 事件类型0)
序号1=(发生时间29, 事件类型4)
序号2=(发生时间34, 事件类型1)
序号3=(发生时间41, 事件类型2) TotalTime=51, CustomerNum=8, timer=11
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间29, 事件类型4)
序号1=(发生时间32, 事件类型0)
序号2=(发生时间34, 事件类型1)
序号3=(发生时间41, 事件类型2)
序号4=(发生时间45, 事件类型3) TotalTime=68, CustomerNum=8, timer=12
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间32, 事件类型0)
序号1=(发生时间34, 事件类型1)
序号2=(发生时间41, 事件类型2)
序号3=(发生时间45, 事件类型3) TotalTime=68, CustomerNum=9, timer=13
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间34, 事件类型1)
序号1=(发生时间36, 事件类型0)
序号2=(发生时间41, 事件类型2)
序号3=(发生时间45, 事件类型3)
序号4=(发生时间49, 事件类型4) TotalTime=86, CustomerNum=9, timer=14
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间36, 事件类型0)
序号1=(发生时间41, 事件类型2)
序号2=(发生时间45, 事件类型3)
序号3=(发生时间49, 事件类型4)
序号4=(发生时间51, 事件类型1) TotalTime=86, CustomerNum=10, timer=15
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间40, 事件类型0)
序号1=(发生时间41, 事件类型2)
序号2=(发生时间45, 事件类型3)
序号3=(发生时间49, 事件类型4)
序号4=(发生时间51, 事件类型1) TotalTime=86, CustomerNum=11, timer=16
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间41, 事件类型2)
序号1=(发生时间44, 事件类型0)
序号2=(发生时间45, 事件类型3)
序号3=(发生时间49, 事件类型4)
序号4=(发生时间51, 事件类型1) TotalTime=103, CustomerNum=11, timer=17
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间44, 事件类型0)
序号1=(发生时间45, 事件类型3)
序号2=(发生时间49, 事件类型4)
序号3=(发生时间51, 事件类型1)
序号4=(发生时间58, 事件类型2) TotalTime=103, CustomerNum=12, timer=18
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间45, 事件类型3)
序号1=(发生时间48, 事件类型0)
序号2=(发生时间49, 事件类型4)
序号3=(发生时间51, 事件类型1)
序号4=(发生时间58, 事件类型2) TotalTime=120, CustomerNum=12, timer=19
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间48, 事件类型0)
序号1=(发生时间49, 事件类型4)
序号2=(发生时间51, 事件类型1)
序号3=(发生时间58, 事件类型2) TotalTime=120, CustomerNum=13, timer=20
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间49, 事件类型4)
序号1=(发生时间51, 事件类型1)
序号2=(发生时间58, 事件类型2)
序号3=(发生时间65, 事件类型3) TotalTime=137, CustomerNum=13, timer=21
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间51, 事件类型1)
序号1=(发生时间58, 事件类型2)
序号2=(发生时间65, 事件类型3) TotalTime=168, CustomerNum=13, timer=22
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间58, 事件类型2)
序号1=(发生时间65, 事件类型3)
序号2=(发生时间68, 事件类型1) TotalTime=186, CustomerNum=13, timer=23
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间65, 事件类型3)
序号1=(发生时间68, 事件类型1)
序号2=(发生时间75, 事件类型2) TotalTime=203, CustomerNum=13, timer=24
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间68, 事件类型1)
序号1=(发生时间75, 事件类型2) TotalTime=235, CustomerNum=13, timer=25
窗口 1
窗口 2
窗口 3
窗口 4
事件表
序号0=(发生时间75, 事件类型2) TotalTime=266, CustomerNum=13, timer=26
窗口 1
窗口 2
窗口 3
窗口 4
事件表 The Average Time is 20.461538 Process finished with exit code 0
银行业务模拟运行结果
队列->队列的应用(银行业务模拟)的更多相关文章
- 队列->队列的表示和实现
文字描述 队列是和栈相反,队列是一种先进先出(first in first out,缩写FIFO)的线性表,它只允许在表的一端进行插入,而在另一端进行删除.和生活中的排队相似,最早进入队列的元素最早离 ...
- 3-08. 栈模拟队列(25)(ZJU_PAT 模拟)
主题链接:http://pat.zju.edu.cn/contests/ds/3-08 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操 ...
- 自定义ThreadPoolExecutor带Queue缓冲队列的线程池 + JMeter模拟并发下单请求
.原文:https://blog.csdn.net/u011677147/article/details/80271174 拓展: https://github.com/jwpttcg66/GameT ...
- POJ - 3476 A Game with Colored Balls---优先队列+链表(用数组模拟)
题目链接: https://cn.vjudge.net/problem/POJ-3476 题目大意: 一串长度为N的彩球,编号为1-N,每个球的颜色为R,G,B,给出它们的颜色,然后进行如下操作: 每 ...
- 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现
一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...
- 剑指offer-用两个栈来实现一个队列-队列与栈-python
用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路:使用两个栈,stackA 用来接收node stackB 用来接收 stackA 的出栈 # -*- cod ...
- TCP控制位 sendUrgentData 队列 队列元素 优先级 极限 急停 置顶
Socket (Java Platform SE 7 ) https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#sendUrge ...
- HDU-1873 看病要排队(队列模拟)
看病要排队 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- Java数组模拟队列 + 优化
队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则. 即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 数组模拟队列 队列本身是有序列表 ...
随机推荐
- hiho 1098 最小生成树二·Kruscal算法 (最小生成树)
题目: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了——但是幸运的是,经过计算机的分析, ...
- js中split 正则表示式 (/[,+]/)
定义和用法 split() 方法用于把一个字符串分割成字符串数组. 语法 stringObject.split(separator,howmany) separator 作为分隔符,separator ...
- tomcat日志格式中的含义
%a - 远程IP地址 %A - 本地IP地址 %b - 发送的字节数,不包括HTTP头,或“ - ”如果没有发送字节 %B - 发送的字节数,不包括HTTP头 %h - 远程主机名 %H - 请求协 ...
- 论http弥补技术ajax、comet、SPADY、websocket
为什么要弥补http?http有什么缺陷? 查询资料中
- nodejs之connect
1.安装: npm install connect
- bzoj1040基环树
... st#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> ...
- 百度上传插件---webuploader的使用
需求:朋友让找一个兼容IE8的上传插件,卧槽,IE8,我当时是崩溃的,然后就搜到了这个百度的插件,官网是这样描述的 WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HT ...
- pandas导入导出数据-【老鱼学pandas】
pandas可以读写如下格式的数据类型: 具体详见:http://pandas.pydata.org/pandas-docs/version/0.20/io.html 读取csv文件 我们准备了一个c ...
- Redis数据结构之ziplist
本文及后续文章,Redis版本均是v3.2.8 本篇文章我们来分析下一种特殊编码的双向链表-ziplist(压缩列表),这种数据结构的功能是将一系列数据与其编码信息存储在一块连续的内存区域,这块内存物 ...
- js中一个对象中遇到一个相同的key所对应的value值相加
如图: 变成: js原生如下: var abc=[ {typeid:1,ade:1}, {typeid:2,ade:1}, {typeid:1,ade:2}, {typeid:1,ade:2}, {t ...