首页 > 其他分享 >队列数据结构实现

队列数据结构实现

时间:2023-10-27 18:56:18浏览次数:32  
标签:QueueSize Comsumer temp 队列 Queue 实现 数据结构 data rear

  1 #include <iostream>
  2 #include<fstream>
  3 using namespace std;
  4 
  5 //顾客信息
  6 struct Inform
  7 {
  8     int Arrival;
  9     int Typed;
 10     int HandleTime;
 11     int RestTime;
 12 };
 13 
 14 //链式存储
 15 struct Comsumer
 16 {
 17     Inform data;
 18     Comsumer* next;
 19 };
 20 
 21 //队列
 22 struct Queue
 23 {
 24     Comsumer* front;
 25     Comsumer* rear;
 26     int QueueSize;
 27 };
 28 
 29 //初始化
 30 void InitQueue(Queue* Q)
 31 {
 32     Q->front = Q->rear = (Comsumer*)malloc(sizeof(Comsumer));
 33     if (Q->front == NULL) exit(OVERFLOW);
 34     Q->front->next = NULL;
 35     Q->QueueSize = 0;
 36 }
 37 
 38 //入队
 39 void EnQueue(Queue* Q,Inform* e)
 40 {
 41     Comsumer* s = (Comsumer*)malloc(sizeof(Comsumer));
 42     if (s == NULL) exit(OVERFLOW);
 43 
 44     s->data.Arrival = e->Arrival;
 45     s->data.HandleTime = e->HandleTime;
 46     s->data.RestTime = e->RestTime;
 47     s->data.Typed = e->Typed;
 48 
 49     Q->rear->next = s;
 50     Q->rear = s;
 51     Q->rear->next = NULL;
 52     Q->QueueSize++;
 53 }
 54 
 55 //出队
 56 void DeQueue(Queue* Q)
 57 {
 58     if (Q->front == Q->rear) return;
 59 
 60     Comsumer* p = Q->front->next;
 61     Q->front->next = p->next;
 62     if (Q->rear == p) Q->rear = Q->front;
 63     free(p);
 64     Q->QueueSize--;
 65 }
 66 
 67 //判断队列是否为空
 68 bool IsEmpty(Queue* Q)
 69 {
 70     if (Q->front == Q->rear) return true;
 71 
 72     return false;
 73 }
 74 
 75 //更新每个队列
 76 void UpdateQueue(Queue* q, int NowTime)
 77 {
 78     Comsumer* p = q->front->next;
 79     if (p != NULL)
 80     {
 81         p->data.RestTime=p->data.RestTime-NowTime;
 82         if (p->data.RestTime <= 0)
 83             DeQueue(q);
 84     }
 85 }
 86 
 87 //选择某个队加入
 88 void QueueSelect(Inform*p,Queue*A,Queue*B,Queue*C)
 89 {
 90     if (p->Typed == 1)
 91     {
 92         if (A->QueueSize <= C->QueueSize)
 93             EnQueue(A, p);
 94         else if (A->QueueSize > C->QueueSize)
 95             EnQueue(C, p);
 96     }
 97     else if (p->Typed == 2)
 98     {
 99         if (B->QueueSize <= C->QueueSize)
100             EnQueue(B, p);
101         else if (B->QueueSize > C->QueueSize)
102             EnQueue(C, p);
103     }
104 }
105 
106 //末尾出队
107 void eQueue(Queue* Q)
108 {
109     Comsumer* p = Q->front->next;
110     while (p->next->next != NULL)
111     {
112         p = p->next;
113     }
114     Q->rear = p;
115 }
116 
117 //根据其他的调整队伍
118 void UpdateSelect(Queue*A, Queue* B, Queue* C)
119 {
120     //C的人数比A少两个就要找A队尾去C
121     if (A->QueueSize - C->QueueSize >= 2)
122     {
123         Inform* temp = (Inform*)malloc(sizeof(Inform));
124         temp->Arrival = A->rear->data.Arrival;
125         temp->HandleTime = A->rear->data.HandleTime;
126         temp->RestTime = A->rear->data.RestTime;
127         temp->Typed = A->rear->data.Typed;
128         EnQueue(C, temp);
129         eQueue(A);
130     }
131     //C的人数比B少两个就要找B队尾去C
132     else if (B->QueueSize - C->QueueSize >= 2)
133     {
134         Inform* temp = (Inform*)malloc(sizeof(Inform));
135         temp->Arrival = B->rear->data.Arrival;
136         temp->HandleTime =B->rear->data.HandleTime;
137         temp->RestTime = B->rear->data.RestTime;
138         temp->Typed = B->rear->data.Typed;
139         EnQueue(C, temp);
140         eQueue(B);
141     }
142 }
143 
144 int main()
145 {
146     fstream fp;
147     fp.open("text2.txt", ios::in);
148 
149     int N;
150     fp >> N;//读取窗口数
151 
152     Queue* A=(Queue*)malloc(sizeof(Queue));
153     Queue* B = (Queue*)malloc(sizeof(Queue));
154     Queue* C = (Queue*)malloc(sizeof(Queue));
155     InitQueue(A);
156     InitQueue(B);
157     InitQueue(C);
158 
159     int MaxTime=0;
160     while (!fp.eof())
161     {
162         //每次读一个进队
163         Inform* temp=(Inform*)malloc(sizeof(Inform));
164         fp >> temp->Arrival >> temp->Typed >> temp->HandleTime;
165         temp->RestTime = temp->HandleTime;//刚来还有的办理时间就是办理时间
166         int NowTime = temp->Arrival-MaxTime;
167         MaxTime = temp->Arrival;
168 
169         //更新三个队列
170         UpdateQueue(A, NowTime);
171         UpdateQueue(B, NowTime);
172         UpdateQueue(C, NowTime);
173 
174         //新元素入队
175         QueueSelect(temp, A, B, C);
176     }
177 
178     //三个都不为空继续更新并出队
179     while (IsEmpty(A) != true || IsEmpty(B) != true || IsEmpty(C) != true)
180     {
181         //时间增加
182         MaxTime++;
183         //更新三个队列
184         UpdateQueue(A, 1);
185         UpdateQueue(B, 1);
186         UpdateQueue(C, 1);
187 
188         UpdateSelect(A, B, C);
189     }
190     cout << MaxTime;
191 }

链式队列

标签:QueueSize,Comsumer,temp,队列,Queue,实现,数据结构,data,rear
From: https://www.cnblogs.com/saucerdish/p/17792989.html

相关文章

  • 逆向手机银行余额修改生成器,实现自定义修改效果
    哈喽大家好,我又来了,我是专注于APP逆向的小库,我从网上找来了一款银行模拟器,就是装逼用的,然后它存在一个问题,就是每次打开那个余额固定死的,也没有其它修改的地方,而一些小伙伴想把这个余额改成自己想要的内容,这个软件我已经改好了,下面是软件的界面图。我这边主要教大家改这两处:教......
  • 腾讯Ckafka队列使用测评
    产品购买活动链接https://cloud.tencent.com/act/pro/618season?developercode=NEcnmZ18&from=20877 或者 https://cloud.tencent.com/act/pro/developer_business-scenario?developercode=NEcnmZ18&from=18122&from=20878前言本文主要是测试Ckafka的性能如何,作为一款商用的消息......
  • 新手教程系列:群晖 Synology Drive教程,如何实现文件同步与备份?
    SynologyDrive是群晖NAS的一款文件同步和共享工具,提供了非常完善的功能,您可以轻松地对文件进行分类、归档、共享等操作,也可以在多个设备之间同步文件、备份文件、共享文件,包括电脑、手机、平板等设备。总的来说,使用SynologyDrive的好处是可以方便快捷地在不同设备之间同步文件,保......
  • 【Java集合】了解集合的框架体系结构及常用实现类,从入门到精通!
    前言通过Java基础的学习,我们掌握了主要的Java语言基本的语法,同时了解学习了Java语言的核心-面向对象编程思想。从集合框架开始,也就是进入了java这些基础知识及面向对象思想进入实际应用编码的过程,通过jdk中集合这部分代码的阅读学习,就能发现这一点。本计划在这篇中把框架体系和......
  • http-template实现原生分页
     packagemainimport( "gorm.io/driver/mysql" "gorm.io/gorm" "html/template" "io" "math" "net/http" "os" "strconv")//商品结构体typeGoodsstruct{ Idint......
  • Java继承 多线程的实现方式——利用 Callable 接口 和 Future 接口方式实现
    利用Callable接口和Future接口方式实现:这种实现方式可以获取到多线程运行的结果 步骤:1.创建一个类,类名比如叫MyCallable,并实现 Callable接口  注:Callable接口有一个泛型,因为这种方式可以获取到多线程运行的结果,泛型就表示结果的类型2.重写 Callable接口里面......
  • Java基础 多线程的实现方式——实现 Runnable 接口的方式进行实现
    实现Runnable接口的方式进行实现:1.定义一个类实现 Runnable接口,并实现run方法2.在run方法里面书写该线程要执行的代码3.然后创建这个实现 Runnable接口的类的实例化对象,这个对象其实就表示多线程要执行的任务4.再去创建一个Thread类的对象,然后把 实现 R......
  • javaweb--多表关系实现
    一对多在多的一方建立外键,指向一的一方的主键多对多利用第三张中间表建立连接,第三张中间表包含两个外键,分别连接两张表的主键一对一多用于表的拆分,将实体中经常使用的字段放在一张表中,不经常使用的字段放在另一张表中,提升查询效率。在任何一方设置外键,连接另一方主键,并设置......
  • Java基础 多线程的实现方式——继承 Thread 类的方式
    多线程的三种实现方式:1.继承Thread类的方式进行实现2.实现Runnable接口的方式进行实现3.利用Callable接口和Future接口方式实现 一、继承Thread类的方式:将类声明为Thread的子类,该子类应重写Thread类的run方法,接下来可以创建子类的对象并启动线程。在......
  • 数据结构与算法-基本概念
    什么是数据结构与算法从广义上讲数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法。从狭义上讲,是指某些著名的数据结构和算法,比如队列、栈、堆、二分查找、动态规划等。这些都是前人智慧的结晶,我们可以直接拿来用......