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