I tried to implement a cyclic Queue using an array, as a task from a coding interview.
Please comment about style, as well as any edge cases I may have missed.
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace CirucularArray
{
[TestClass]
public class CyclicQueueUsingArray
{
[TestMethod]
public void QueueTest()
{
CyclicQueue Q = new CyclicQueue(5);
Q.Enqueue(1);
Assert.AreEqual(1, Q.Front);
Q.Enqueue(2);
Assert.AreEqual(1, Q.Front);
Assert.AreEqual(2, Q.Rear);
Q.Enqueue(3);
Assert.AreEqual(1, Q.Front);
Assert.AreEqual(3, Q.Rear);
Assert.AreEqual(1, Q.Dequeue());
Assert.AreEqual(2, Q.Front);
Assert.AreEqual(3, Q.Rear);
Assert.AreEqual(2, Q.Dequeue());
Assert.AreEqual(3, Q.Front);
Assert.AreEqual(3, Q.Rear);
Assert.AreEqual(3, Q.Dequeue());
}
[TestMethod]
public void QueueOverflowTest()
{
CyclicQueue Q = new CyclicQueue(5);
Q.Enqueue(1);
Q.Enqueue(2);
Q.Enqueue(3);
Q.Enqueue(4);
Q.Enqueue(5);
Assert.AreEqual(1, Q.Dequeue());
Q.Enqueue(6);
Assert.AreEqual(2, Q.Front);
Assert.AreEqual(6, Q.Rear);
}
}
public class CyclicQueue
{
public int[] _buffer;
private int _start;
private int _end;
private int _size;
private int _maxSize;
public CyclicQueue(int maxSize)
{
_maxSize = maxSize;
_buffer = new int[_maxSize];
_start = 0;
_end = 0;
}
public void Enqueue(int newValue)
{
if (_size == _maxSize)
{
throw new OutOfMemoryException("Queue at full capacity");
}
if (_size > 0)
{
_end = (_end + 1) % _maxSize;
}
_buffer[_end] = newValue;
_size++;
}
public int Dequeue()
{
if (_size == 0)
{
throw new IndexOutOfRangeException("Queue is empty");
}
int result = _buffer[_start];
_size--;
_start = (_start + 1) % _maxSize;
return result;
}
public int Front
{
get { return _buffer[_start]; }
}
public int Rear
{
get { return _buffer[_end]; }
}
}
}