队列->队列的应用(银行业务模拟)
文字描述
示意图
代码实现
//
// 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数组模拟队列 + 优化
队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则. 即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 数组模拟队列 队列本身是有序列表 ...
随机推荐
- PowerDesigner的Table视图同时显示Code和Name的方法[转发]
PowerDesigner中Table视图同时显示Code和Name,像下图这样的效果: 实现方法:Tools-Display Preference
- (原创)cocos2dx-lua TableView官方demo分析
本来是想看看网上的教程文章,结果看了好几篇,复制代码各种报错,有很多不存在的类和变量,根本用不了. 所以干脆自己去看官方demo,经过自己分析测试,已经大概会用了,顺便记录一下. 以下是代码,复制粘贴 ...
- Sleep和wait
sleep()和wait()的区别及wait方法的一点注意事项 一.查看API sleep是Thread类的方法,导致此线程暂停执行指定时间,给其他线程执行机会,但是依然保持着监控状态,过了指定时 ...
- Flask简述
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...
- Bootstrap-datepicker3官方文档中文翻译---概述(原文链接 http://bootstrap-datepicker.readthedocs.io/en/latest/index.html)
bootstrap-datepicker Bootstrap-datepicker 提供了一个拥有Bootstrap样式的弹性Datepicker控件 Requirements/使用要求 Bootst ...
- Git使用十:匿名分支和checkout命令
匿名分支 新建个仓库,并且初始化,创建3个文件,并提交 此时在没有创建新分支的情况下,checkout一下,比如上一个快照 这一段话的意思是,使用了checkout命令,但是没有指定分支名,所以git ...
- python-argparse使用
官方文档:https://docs.python.org/zh-cn/3.7/library/argparse.html?highlight=argparse#module-argparse argp ...
- apache负载调优
Apache负载调优 watch -n 1 -d "pgrep httpd|wc -l" #apache动态查看连接数 ps aux | grep httpd | wc ...
- SQL Server2012如何导出sql脚本并且还原数据库
一 备份数据库 1 选择某一个数据库,右键依次选择:任务==>生成脚本: 2 选择要编写脚本的数据库对象,注意此处可以选择特定的数据库对象,我们可以选择我们需要备份的数据表. 3 在当 ...
- js要怎么接收后端传的excel文件流?
方法1: 无需js,直接用a标签去接你的输出流 <a href="<你的返回流的Action路径>" >下载</a> 方法2:使用js,前提是你 ...