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 }