Skip to content

Commit ab3e826

Browse files
committed
Support buld operations for ring buffer
1 parent d49939f commit ab3e826

File tree

2 files changed

+124
-75
lines changed

2 files changed

+124
-75
lines changed

Advanced.Algorithms.Tests/DataStructures/Queues/CircularQueue_Tests.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@ public void CircularQueue_Test()
1313
{
1414
var Queue = new CircularQueue<int>(7);
1515

16-
Queue.Enqueue(1);
17-
Queue.Enqueue(2);
16+
Assert.AreEqual(0, Queue.Enqueue(1));
17+
Assert.AreEqual(0, Queue.Enqueue(2));
1818

19-
Queue.Enqueue(3);
20-
Queue.Enqueue(4);
21-
Queue.Enqueue(5);
22-
Queue.Enqueue(6);
23-
Queue.Enqueue(7);
24-
Queue.Enqueue(8);
25-
Queue.Enqueue(9);
19+
Assert.AreEqual(0, Queue.Enqueue(3));
20+
Assert.AreEqual(0, Queue.Enqueue(4));
21+
Assert.AreEqual(0, Queue.Enqueue(5));
22+
Assert.AreEqual(0, Queue.Enqueue(6));
23+
Assert.AreEqual(0, Queue.Enqueue(7));
24+
Assert.AreEqual(1, Queue.Enqueue(8));
25+
Assert.AreEqual(2, Queue.Enqueue(9));
2626

2727
Assert.AreEqual(Queue.Count, 7);
2828
Assert.AreEqual(3, Queue.Dequeue());
@@ -47,8 +47,8 @@ public void CircularQueue_Test()
4747

4848
Assert.AreEqual(Queue.Count, 0);
4949

50-
Queue.Enqueue(1);
51-
Queue.Enqueue(2);
50+
Assert.AreEqual(0, Queue.Enqueue(1));
51+
Assert.AreEqual(0, Queue.Enqueue(2));
5252

5353
Assert.AreEqual(Queue.Count, 2);
5454
Assert.AreEqual(1, Queue.Dequeue());
@@ -57,6 +57,6 @@ public void CircularQueue_Test()
5757
Assert.AreEqual(Queue.Dequeue(), 2);
5858
}
5959

60-
60+
6161
}
62-
}
62+
}
Lines changed: 111 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,99 +1,148 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
53

6-
namespace Advanced.Algorithms.DataStructures.Queues
4+
/// <summary>
5+
/// Cicular queue aka Ring Buffer using fixed size array
6+
/// </summary>
7+
/// <typeparam name="T"></typeparam>
8+
public class CircularQueue<T>
79
{
10+
private T[] queue;
11+
12+
//points to the index of next element to be deleted
13+
private int start = 0;
14+
15+
//points to the index new element should be inserted
16+
private int end = 0;
17+
18+
public int Count { get; private set; }
19+
20+
public CircularQueue(int size)
21+
{
22+
queue = new T[size];
23+
}
24+
825
/// <summary>
9-
/// Cicular queue aka Ring Buffer using fixed size array
26+
/// Note: When buffer overflows oldest data will be erased
27+
/// O(1) time complexity
1028
/// </summary>
11-
/// <typeparam name="T"></typeparam>
12-
public class CircularQueue<T>
29+
/// <param name="data"></param>
30+
public T Enqueue(T data)
1331
{
14-
private T[] queue;
15-
16-
//points to the index of next element to be deleted
17-
private int start = 0;
32+
T deleted = default(T);
1833

19-
//points to the index new element should be inserted
20-
private int end = 0;
34+
//wrap around removing oldest element
35+
if (end > queue.Length - 1)
36+
{
37+
end = 0;
2138

22-
public int Count { get; private set; }
39+
if (start == 0)
40+
{
41+
deleted = queue[start];
42+
start++;
43+
}
44+
}
2345

24-
public CircularQueue(int size)
46+
//when end meets start after wraping around
47+
if (end == start && Count > 1)
2548
{
26-
queue = new T[size];
49+
deleted = queue[start];
50+
start++;
2751
}
2852

29-
/// <summary>
30-
/// Note: When buffer overflows oldest data will be erased
31-
/// </summary>
32-
/// <param name="data"></param>
33-
public void Enqueue(T data)
53+
queue[end] = data;
54+
end++;
55+
56+
if (Count < queue.Length)
3457
{
35-
//wrap around removing oldest element
36-
if (end > queue.Length - 1)
37-
{
38-
end = 0;
58+
Count++;
59+
}
3960

40-
if(start == 0)
41-
{
42-
start++;
43-
}
44-
}
61+
return deleted;
62+
}
4563

46-
//when end meets start after wraping around
47-
if (end == start && Count > 1)
48-
{
49-
start++;
50-
}
64+
/// <summary>
65+
/// O(bulk.Length) time complexity
66+
/// </summary>
67+
/// <param name="bulk"></param>
68+
/// <returns></returns>
69+
public IEnumerable<T> Enqueue(T[] bulk)
70+
{
71+
var deletedList = new List<T>();
5172

52-
queue[end] = data;
53-
end++;
73+
foreach (var item in bulk)
74+
{
75+
var deleted = Enqueue(item);
5476

55-
if (Count < queue.Length)
77+
if (!deleted.Equals(default(T)))
5678
{
57-
Count++;
79+
deletedList.Add(deleted);
5880
}
5981
}
6082

83+
return deletedList;
84+
}
85+
86+
/// <summary>
87+
/// O(1) time complexity
88+
/// </summary>
89+
/// <returns></returns>
90+
public T Dequeue()
91+
{
92+
if (Count == 0)
93+
{
94+
throw new Exception("Empty queue.");
95+
}
96+
97+
var element = queue[start];
98+
start++;
6199

62-
public T Dequeue()
100+
//wrap around
101+
if (start > queue.Length - 1)
63102
{
64-
if (Count == 0)
103+
start = 0;
104+
105+
if (end == 0)
65106
{
66-
throw new Exception("Empty queue.");
107+
end++;
67108
}
109+
}
68110

69-
var element = queue[start];
70-
start++;
111+
Count--;
71112

72-
//wrap around
73-
if (start > queue.Length - 1)
74-
{
75-
start = 0;
113+
if (start == end && Count > 1)
114+
{
115+
end++;
116+
}
76117

77-
if (end == 0)
78-
{
79-
end++;
80-
}
81-
}
118+
//reset
119+
if (Count == 0)
120+
{
121+
start = end = 0;
122+
}
82123

83-
Count--;
124+
return element;
125+
}
84126

85-
if (start == end && Count > 1)
86-
{
87-
end++;
88-
}
127+
/// <summary>
128+
/// O(bulkNumber) time complexity
129+
/// </summary>
130+
/// <param name="bulkNumber"></param>
131+
public IEnumerable<T> Dequeue(int bulkNumber)
132+
{
133+
var deletedList = new List<T>();
134+
while (bulkNumber > 0 && Count > 0)
135+
{
136+
var deleted = Dequeue();
89137

90-
//reset
91-
if (Count == 0)
138+
if (!deleted.Equals(default(T)))
92139
{
93-
start = end = 0;
140+
deletedList.Add(deleted);
94141
}
95-
96-
return element;
97142
}
143+
144+
return deletedList;
98145
}
146+
99147
}
148+

0 commit comments

Comments
 (0)