1 Queue2

3 usingSystem;4 usingSystem.Collections.Generic;5 usingSystem.Linq;6 usingSystem.Text;7 usingSystem.Threading;8

9 namespaceDataStructure10 {11 ///

12 ///队列接口13 ///

14 interface IQueue

15 {16 void EnQueue(T elem); //入队列操作

17 T DeQueue(); //出队列操作

18 T GetFront(); //取对头元素

19 int GetLength(); //求队列的长度

20 bool IsEmpty(); //判断队列是否为空

21 void Clear(); //清空队列

22 bool IsFull(); //判断队列是否为满

23 }24

25 ///

26 ///银行队列接口27 ///

28 interface IBankQueue : IQueue

29 {30 int GetCallnumber(); //获取服务号码

31 }32

33

34 ///

35 ///循环顺序队列36 ///

37 ///

38 class CSeqQueue : IQueue

39 {40 private int maxsize; //循环顺序队列的容量

41 private T[] data; //数组,用于存储循环顺序队列中的数据元素

42 private int front; //指示最近一个已经离开队列的元素所占有的位置 循环顺序队列的对头

43 private int rear; //指示最近一个进入队列的元素的位置 循环顺序队列的队尾

44

45 public T this[intindex]46 {47 get { returndata[index]; }48 set { data[index] =value; }49 }50

51 //容量属性

52 public intMaxsize53 {54 get { returnmaxsize; }55 set { maxsize =value; }56 }57

58 //对头指示器属性

59 public intFront60 {61 get { returnfront; }62 set { front =value; }63 }64

65 //队尾指示器属性

66 public intRear67 {68 get { returnrear; }69 set { rear =value; }70 }71

72 publicCSeqQueue()73 {74

75 }76

77 public CSeqQueue(intsize)78 {79 data = newT[size];80 maxsize =size;81 front = rear = -1;82 }83

84 //判断循环顺序队列是否为满

85 public boolIsFull()86 {87 if ((front == -1 && rear == maxsize - 1) || (rear + 1) % maxsize ==front)88 return true;89 else

90 return false;91 }92

93 //清空循环顺序列表

94 public voidClear()95 {96 front = rear = -1;97 }98

99 //判断循环顺序队列是否为空

100 public boolIsEmpty()101 {102 if (front ==rear)103 return true;104 else

105 return false;106 }107

108 //入队操作

109 public voidEnQueue(T elem)110 {111 if(IsFull())112 {113 Console.WriteLine("Queue is Full !");114 return;115 }116 rear = (rear + 1) %maxsize;117 data[rear] =elem;118 }119

120 //出队操作

121 publicT DeQueue()122 {123 if(IsEmpty())124 {125 Console.WriteLine("Queue is Empty !");126 return default(T);127 }128 front = (front + 1) %maxsize;129 returndata[front];130 }131

132 //获取对头数据元素

133 publicT GetFront()134 {135 if(IsEmpty())136 {137 Console.WriteLine("Queue is Empty !");138 return default(T);139 }140 return data[(front + 1) % maxsize];//front从-1开始

141 }142

143 //求循环顺序队列的长度

144 public intGetLength()145 {146 return (rear - front + maxsize) %maxsize;147 }148 }149

150 ///

151 ///链队列结点类152 ///

153 ///

154 class QueueNode

155 {156 private T data; //数据域

157 private QueueNode next; //引用域

158

159 public QueueNode(T val, QueueNodep)160 {161 data =val;162 next =p;163 }164

165 public QueueNode(QueueNodep)166 {167 next =p;168 }169

170 publicQueueNode(T val)171 {172 data =val;173 next = null;174 }175

176 publicQueueNode()177 {178 data = default(T);179 next = null;180 }181

182 //数据域属性

183 publicT Data184 {185 get { returndata; }186 set { data =value; }187 }188

189 //引用域属性

190 public QueueNodeNext191 {192 get { returnnext; }193 set { next =value; }194 }195 }196

197 ///

198 ///链队列类199 ///

200 ///

201 class LinkQueue : IQueue

202 {203 private QueueNode front; //队列头指示器

204 private QueueNode rear; //队列尾指示器

205 private int size; //队列结点个数206

207 //队列属性

208 public QueueNodeFront209 {210 get { returnfront; }211 set { front =value; }212 }213

214 public QueueNodeRear215 {216 get { returnrear; }217 set { rear =value; }218 }219

220 public intSize221 {222 get { returnsize; }223 set { size =value; }224 }225

226 //初始化链队列

227 publicLinkQueue()228 {229 front = rear = null;230 size = 0;231 }232

233 public intGetLength()234 {235 returnsize;236 }237

238 public voidClear()239 {240 front = rear = null;241 size = 0;242 }243

244 public boolIsEmpty()245 {246 if ((front == rear) && (size == 0))247 return true;248 else

249 return false;250

251 }252

253 //链队列没有容量限制 返回false

254 public boolIsFull()255 {256 return false;257 }258

259 //入队操作

260 public voidEnQueue(T item)261 {262 QueueNode q = new QueueNode(item);263 if(IsEmpty())264 {265 front =q;266 rear =q;267 }268 else

269 {270 rear.Next =q;271 rear =q;272 }273 ++size;274 }275

276 //出对操作

277 publicT DeQueue()278 {279 if(IsEmpty())280 {281 Console.WriteLine("Queue is Empty !");282 return default(T);283 }284 QueueNode p =front;285 front =front.Next;286

287 if (front == null)288 {289 rear = null;290 }291 --size;292 returnp.Data;293 }294

295 //获取链队列头结点的值

296 publicT GetFront()297 {298 if(IsEmpty())299 {300 Console.WriteLine("Queue is Empty !");301 return default(T);302 }303 returnfront.Data;304 }305

306 }307

308

309 ///

310 ///银行叫号链队列类311 ///

312 class LinkBankQueue : LinkQueue, IBankQueue313 {314 private intcallnumber;315

316 public intCallnumber317 {318 get { returncallnumber; }319 set { callnumber =value; }320 }321

322 //获取服务号码

323 public intGetCallnumber()324 {325 if ((IsEmpty()) && callnumber == 0)326 {327 callnumber = 1;328 }329 else

330 callnumber++;331 returncallnumber;332 }333 }334

335 ///

336 ///银行叫号顺序队列类337 ///

338 class CSeqBankQueue : CSeqQueue, IBankQueue339 {340 private int callnumber; //记录系统自动产生的新来顾客的服务号码

341

342 public intCallnumber343 {344 get { returncallnumber; }345 set { callnumber =value; }346 }347

348 publicCSeqBankQueue()349 {350

351 }352

353 public CSeqBankQueue(intsize)354 : base(size)355 {356

357 }358

359 //获得服务号码

360 public intGetCallnumber()361 {362 if ((IsEmpty()) && callnumber == 0)363 {364 callnumber = 1;365 }366 else

367 {368 callnumber++;369 }370 returncallnumber;371 }372 }373

374 ///

375 ///服务窗口类376 ///

377 classServiceWindow378 {379 IBankQueue bankQ;380

381 //服务队列属性

382 publicIBankQueue BankQ383 {384 get { returnbankQ; }385 set { bankQ =value; }386 }387

388 public voidService()389 {390 while (true)391 {392 Thread.Sleep(10000);393 if (!bankQ.IsEmpty())394 {395 Console.WriteLine();396 lock(bankQ)397 {398 Console.WriteLine("请{0}号到{1}号窗口!", bankQ.DeQueue(), Thread.CurrentThread.Name);399 }400 }401 }402 }403 }404

405 classQueue406 {407

408 static voidMain()409 {410 IBankQueue bankQueue = null;411 Console.WriteLine("请选择存储结构的类型:1.顺序队列 2.链队列:");412 char selectFlag =Convert.ToChar(Console.ReadLine());413 switch(selectFlag)414 {415 /*初始化顺序队列*/

416 case '1':417 int count; //接受循环顺序队列的容量

418 Console.WriteLine("请输入队列可容纳的人数:");419 count =Convert.ToInt32(Console.ReadLine());420 bankQueue = newCSeqBankQueue(count);421 break;422 /*初始化链队列*/

423 case '2':424 bankQueue = newLinkBankQueue();425 break;426

427 }428 int windowcount = 4; //设置银行柜台的服务窗口数

429

430 ServiceWindow[] sw = newServiceWindow[windowcount];431 Thread[] swt = newThread[windowcount];432 for (int i = 0; i < windowcount; i++)433 {434 sw[i] = newServiceWindow();435 sw[i].BankQ =bankQueue;436 swt[i] = new Thread(newThreadStart(sw[i].Service));437 swt[i].Name = "" + (i + 1);438 swt[i].Start();439 }440 while (true)441 {442 Console.WriteLine("请点击触摸屏获取号码:");443 Console.ReadLine();444

445 intcallnumber;446 if (!bankQueue.IsFull())447 {448 callnumber =bankQueue.GetCallnumber();449 Console.WriteLine("您的号码是:{0},您前面有{1}位,请等待!", callnumber, bankQueue.GetLength());450 bankQueue.EnQueue(callnumber);451 }452 else

453 Console.WriteLine("现在业务繁忙,请稍后再来!");454 Console.WriteLine();455 }456 }457 }458 }

c#队列取值_C# 队列相关推荐

  1. c#队列取值_在队列的开头获取对象– C#中的窥视操作

    要在队列的开始处获取对象,代码如下- 示例using System; using System.Collections.Generic; public class Demo { public stat ...

  2. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  3. ffplay分析 (视频从Frame(解码后)队列取数据到SDL输出)

    <ffplay的数据结构分析> <ffplay分析(从启动到读取线程的操作)> <ffplay分析(视频解码线程的操作)> <ffplay分析(音频解码线程的 ...

  4. ffplay 分析(音频从Frame(解码后)队列取数据到SDL输出)

    <ffplay的数据结构分析> <ffplay分析(从启动到读取线程的操作)> <ffplay分析(视频解码线程的操作)> <ffplay分析(音频解码线程的 ...

  5. java双端队列工作密取,同步器皿、并发容器、阻塞队列、双端队列与工作密取...

    同步容器.并发容器.阻塞队列.双端队列与工作密取 在多线程的开发中经常会碰到数据的并发修改,并发存取,因此正确的使用不同的容器很关键,直接影响到数据的正确性.下面主要记录下三种重要的队列,以及一种非常 ...

  6. c语言中int的取值范围_c语言入门(1)

    c语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...

  7. 2字节取值范围_C语言整数的取值范围以及数值溢出

    short.int.long 是C语言中常用的三种整数类型,分别称为短整型.整型.长整型.在现代操作系统中,short.int.long 的长度分别是 2.4.4 或者 8,它们只能存储有限的数值,当 ...

  8. 阻塞队列与非阻塞队列

    阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用.阻塞队列常用 ...

  9. javax消息队列_Java面试—消息队列

    消息队列面试题 题目来自于中华石杉,解决方案根据自己的思路来总结而得. 题目主要如下: 1. 为什么要引入消息队列? 消息队列的引入可以解决3个核心问题: 解耦 异步 削峰 解耦 在一个项目中,如果一 ...

最新文章

  1. JCIM | 用于自动生成类药分子的生成网络复合体(GNC)
  2. Ajax回退刷新页面问题的解决办法
  3. 后台给前台服务器控件添加样式
  4. 放置奇兵 算法 月度活动 破碎时空记录 第六关 尸妖+鹿男(奥博隆)
  5. php串行化,PHP串行化与JSON
  6. BufferedInputStream与ImageInputStream
  7. 天气预报的Ajax效果
  8. 反弹式木马原理_汽车避震器的原理与改装问题
  9. 关于scanf对换行的吸收
  10. 随想录(MFC开发有感)
  11. GitLab CI 中激活Anaconda环境
  12. CleanMyMac偏好设置你知道多少?
  13. 高中计算机编程语句,高中信息技术程序设计知识点.doc
  14. 数据分析3_淘宝用户行为分析_阿里云天池
  15. android 渠道排名,安卓APP渠道效果统计***排名
  16. git 创建新分支并关联远程分支_git 把远程分支拿到本地,并建立关联关系track | 学步园...
  17. 【进阶指南】玉米田【状压DP】
  18. STL库:stack和queue
  19. 爬取94神马网的电影信息
  20. c语言教程github,GitHub - saitjr/C-Toturials: C语言教程

热门文章

  1. IdentityServer4系列 | 简化模式
  2. 跟我一起学.NetCore之EF Core 实战入门,一看就会
  3. 全球顶级开源大神们现身 COSCon'20
  4. ABP VNext实践之搭建可用于生产的IdentityServer4
  5. ASP.NET Core 3.x - Endpoint Routing 路由体系的内部机制
  6. 集成平台集群任务动态分派
  7. C# 版本 疫情传播仿真程序
  8. 中间件是什么?在.NET Core中的工作原理又是怎样的呢?
  9. 胡浩:人人能学的AI《从零开始机器学习》苏州.NET俱乐部课程分享
  10. Asp.Net Core SignalR 用泛型Hub优雅的调用前端方法及传参