Стек C # с удаляемыми элементами - PullRequest
1 голос
/ 01 мая 2009

Мне нужна структура стека, которая также позволяет удалять элементы. Я не могу найти ничего подобного в .Net Framework. Какая структура предоставляет мне наилучшую основу для реализации этого?

Ответы [ 5 ]

7 голосов
/ 01 мая 2009

Я бы использовал LinkedList, так как он имеет методы для AddFirst (Push) и RemoveFirst (Pop). Но тогда у него также есть простой метод Remove, который можно использовать для удаления посередине.

3 голосов
/ 01 мая 2009

Может быть LinkedList<T>? Вы должны были бы обернуть это самостоятельно, чтобы рассматривать это как Stack<T>, все же. Конечно, вы можете просто использовать List<T> - но вам придется взять на себя расходы на удаление из середины ...

Что-то вроде:

using System;
using System.Collections.Generic;
class MyStack<T> {
    private readonly LinkedList<T> list = new LinkedList<T>();
    public void Push(T value) {
        list.AddLast(value);
    }
    public int Count { get { return list.Count; } }
    public T Pop() {
        LinkedListNode<T> node = list.Last;
        if(node == null) throw new InvalidOperationException();
        list.RemoveLast();
        return node.Value;
    }
    public bool Remove(T item) {
        return list.Remove(item);
    }
}

с любыми другими методами / синхронизацией / и т.д., которые вам нужны.

1 голос
/ 01 мая 2009

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

Если вам нужно удалить элементы в середине стека, вы можете использовать встроенный универсальный ListAt RemoveAt ().

1 голос
/ 01 мая 2009
System.Collections.Generic.List<T>

или

System.Collections.Generic.LinkedList<T>

в зависимости от обстоятельств.

0 голосов
/ 01 мая 2009

Под удалением элементов подразумевается удаление элементов, которые не находятся на вершине стека?

Один из способов сделать это - использовать List, а затем использовать методы расширения для реализации поведения, подобного стеку (закодировано в блокноте, приносим извинения за любые незначительные ошибки). Затем вы можете также выполнить специальную обработку (возможно, вы хотите вернуть ноль или выдать исключение, если список пуст, возможно, вы хотите убедиться, что элемент еще не находится в списке и т. Д.

public static void Push<T>(this IList<T> list, T item)
{
    list.InsertAt(0, item);
}

public static T Pop<T>(this IList<T> list)
{
    if(list.Count > 0)
    {
        T value = list[0];
        list.RemoveAt(0);
        return value;
    }
    // handle error
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...