Queue

 1 using System;
 2 using System.Collections;
 3 using System.Collections.Generic;
 4 using System.Threading;
 5 
 6 public class Queue<v> : iQueue<v> {
 7 
 8     public List<v> list;
 9     int cursor, current, max, flag;
10     const int reduce = 5;
11 
12     public Queue() {
13         list = new List<v>();
14         cursor = -1;
15         current = 0;
16         max = 0;
17         flag = -1;
18     }
19 
20     private object locker = new object();
21     public bool Dequeue(ref v data) {
22         lock (locker)
23             if (max > 0) {
24                 if ((current + 1) - (cursor + 1) == max + 1 || max - current > 0)
25                     cursor++;
26                 else
27                     cursor = 0;
28 
29                 data = list[cursor];
30                 max--;
31                 return true;
32             } else
33                 return false;
34     }
35 
36     private int count = 0;
37     public void Enqueue(v data) {
38         lock (locker) {
39 
40             if (current == list.Count)
41                 list.Add(data);
42             else
43                 list[current] = data;
44 
45             if (cursor > -1 && current - cursor - max == 1) {
46                 flag = current;
47                 current = 0;
48             } else {
49                 current++;
50                 while (cursor < current && current <= flag)
51                     current++;
52             }
53 
54             max++;
55 
56             if (max + Math.Max(current, cursor) < list.Count) {
57                 if (++count == reduce) {
58                     list.RemoveAt(list.Count - 1);
59                     list.TrimExcess();
60                     count -= reduce;
61                 }
62             } else
63                 count = 0;
64         }
65     }
66 
67     public bool Peek(ref v data) {
68         lock (locker)
69             if (max > 0) {
70                 int index = cursor;
71                 if ((current + 1) - (cursor + 1) == max + 1 || max - current > 0)
72                     index++;
73                 else
74                     index = 0;
75 
76                 data = list[index];
77                 return true;
78             } else
79                 return false;
80     }
81 }
82 
83 public interface iQueue<v> {
84     void Enqueue(v data);
85     bool Dequeue(ref v data);
86     bool Peek(ref v data);
87 }

 

posted @ 2019-06-05 14:18  Makemoretime  阅读(164)  评论(0编辑  收藏  举报