Круговой очереди связанных с использованием C#


В качестве упражнения, я реализовал круговой очереди связанных с использованием массивов в качестве базовой структуры данных. Я был бы признателен, если кто-то может рассмотреть его для меня.

    class BoundedQueue<T> {

    T[] que;
    int head;       // remove from head
    int tail;       // insert at tail


    public BoundedQueue(int quesize)
    {
        head = tail = -1;
        que = new T[quesize];
    }

    public void enqueue(T elem)  // if next index to tail == head => Q is FULL
    {
        int newIndex = nextIndex(tail);
        if ( newIndex == head)
            throw new BoundedQueueException(Full);

        tail = newIndex;
        que[newIndex] = elem;
        if (head == -1)
            head = 0;
    }

    public T dequeue()  // After removing from head, if that was the only element in Q
    // Mark Q to be empty by setting head and tail to -1
    {
        if (head == -1)
            throw new BoundedQueueException(Empty);

        T elem = que[head];
        que[head] = default(T);

        if (head == tail)
        {
            head = tail = -1;
        }
        else
        {
            head = nextIndex(head);
        }

        return elem;
    }

    private int nextIndex(int index)
    {
        return (index + 1) % que.Length;
    }

}


5279
10
задан 9 марта 2011 в 11:03 Источник Поделиться
Комментарии
4 ответа


  1. Обработка исключений должна быть добавлена
    в конструкторе, обработка отрицательный
    quesize. Или взглянем на код
    Контрактов.

  2. Вместо инициализации головуи
    хвост до -1, вы могли бы использовать
    значение null Интс, и регулировать
    логики, поэтому она не полагаться на
    магическое число -1.

  3. Реализовать некоторые недостающие функции.
    (возможно, были оставлены
    намеренно): реализовать интерфейс ICollection и IEnumerable интерфейс, от них веет().

  4. Незначительный момент именования. В C# имена методов начинаются с заглавной буквы.

  5. Помните, что это не безопасная класса Thread.

  6. Добавить некоторые комментарии, этот код не что самодокументируемыми. Или, если это возможно, сделать его самодокументируемым, например, если ( руководитель == хвост ) может быть если ( счетчик == 0 ).

12
ответ дан 10 марта 2011 в 12:03 Источник Поделиться

Это не ясно, почему вы хотите реализовать такую структуру данных, как круговой очереди. Внешне единственное Его отличие от обычных очередей является то, что она имеет максимальную пропускную способность. Но если единственный смысл реализации было получить максимум возможностей, то я бы использовать связанный список LinkedList или даже регулярные очередь внутренне. Код будет более читабельным, если вы избавитесь от этих индекса игры. Образец С класса LinkedList:

class BoundedQueue<T> {

private readonly LinkedList<T> _internalList = new LinkedList<T>();
private readonly int _maxQueueSize;

public BoundedQueue(int queuesize)
{
if (queueSize < 0) throw new ArgumentException("queueSize");
_maxQueueSize = queueSize
}

public void Enqueue(T elem)
{
if (_internalList.Count == _maxQueueSize)
throw new BoundedQueueException(Full);
_internalList.AddLast(elem);
}

public T dequeue()
{
if (_internalList.Count == 0)
throw new BoundedQueueException(Empty);

T elem = _internalList.First;
_internalList.RemoveFirst();
return elem;
}
}

П. С.: Также рассмотреть вопрос об объявлении поля только для чтения сайта.

4
ответ дан 10 марта 2011 в 12:03 Источник Поделиться

Несколько незначительных замечаний.


  1. В C#, как правило, использованием camelCase для имен методов.

  2. А Peek() метод или свойство count может быть полезным.

  3. Я бы предпочел использовать оператор if в методе NextIndex вместо оператора модуля.


индекс++
если (индекс >= кы.Длина)
индекс = 0;
возвращение индекса;

Я не уверен, что будет работать быстрее, я подозреваю, что если, но я думаю, что если бы более четкому уяснению того, что вы пытаетесь сделать.

3
ответ дан 10 марта 2011 в 12:03 Источник Поделиться


  1. Использовать XML-doc вместо комментариев при описании метода или свойства. Особенно для класса, который предназначен для использования многими людьми с разными целями (универсальные коллекции попадают в эту категорию)

  2. Именования. Методы действительно должны быть верблюжьего и вы обычно хотите использовать глаголы, как GetNextIndex

  3. Я бы добавила графу метод или свойство для внешнего и внутреннего использования (это полезно для звонящего и позволяет переписать некоторые части кода более семантический способ)

3
ответ дан 10 марта 2011 в 05:03 Источник Поделиться