C#与可删除元素堆叠

时间:2009-05-01 13:42:29

标签: c# .net data-structures

我需要一个堆栈结构,它也允许删除元素。我在.Net框架中找不到这样的东西。哪种结构为我实现这个提供了最好的基础?

5 个答案:

答案 0 :(得分:7)

我会使用LinkedList,因为它有AddFirst(Push)和RemoveFirst(Pop)的方法。但是它还有一个简单的Remove方法,可用于在中间删除。

答案 1 :(得分:3)

也许是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);
    }
}

使用您需要的任何其他方法/同步/等。

答案 2 :(得分:1)

System.Collections.Generic.List<T>

System.Collections.Generic.LinkedList<T>

视情况而定。

答案 3 :(得分:1)

好吧,任何类似列表的结构都可以用作堆栈。你只需推送和弹出项目。

如果需要删除堆栈中间的项目,可以使用内置的通用List的RemoveAt()。

答案 4 :(得分:0)

删除元素是否意味着删除不在堆栈顶部的项目?

你能做到的一种方法是使用List然后使用扩展方法来实现堆栈之类的行为(用记事本编码,对任何小错误道歉)。然后你也可以进行特殊处理(如果列表为空,你可能想要返回null或抛出异常,也许你想确保该项目不在列表中,等等。

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
}