如何在C#中删除不在堆栈顶部的堆栈项

Eny*_*yra 32 c# stack

不幸的是,只能通过"pop"从堆栈中删除项目.堆栈没有"删除"方法或类似的东西,但我有一个堆栈(是的,我需要一个堆栈!),我需要从中删除一些元素.

有这个诀窍吗?

Bin*_*ier 50

如果您需要删除不在顶部的项目,那么您需要的不是堆栈.

尝试从List中创建自己的堆栈实现.然后,您可以实现自己的推送和弹出功能(在列表中添加和删除),以及您自己的特殊PopFromTheMiddle功能.

例如

public class ItsAlmostAStack<T>
{
    private List<T> items = new List<T>();

    public void Push(T item)
    {
        items.Add(item);
    }
    public T Pop()
    {
        if (items.Count > 0)
        {
            T temp = items[items.Count - 1];
            items.RemoveAt(items.Count - 1);
            return temp;
        }
        else
            return default(T);
    }
    public void Remove(int itemAtPosition)
    {
        items.RemoveAt(itemAtPosition);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 围绕现有容器进行自定义实施可让您完成所需的一切.如果你像我一样需要一个双端堆栈(destack),它还可以让你编写最棒的函数名:PushBottom(),PopBottom()和PeekBottom():). (12认同)
  • 一个没有理由的downvote?怎么会这样?如果你不喜欢我的回答,或者有什么问题,你可以告诉我,我可以解决它吗?我们都在这里学习:)谢谢. (11认同)

Mic*_*ski 11

考虑使用不同的容器.也许是LinkedList.然后你可以使用

AddFirst
AddLast
RemoveLast
RemoveFirst

就像从堆栈弹出/推送一样,你可以使用

Remove

从列表中间删除任何节点


Ben*_*own 8

您可以使用LinkedList

基于列表的删除可能效率较低.在通过引用移除基于列表的堆栈将具有O(N)搜索和O(N)调整大小.LinkedList搜索是O(N),删除是O(1).对于按索引删除,LinkedList应该有O(N)遍历和O(1)删除,而List将有O(1)遍历(因为它是索引)和O(N)删除由于调整大小.

除了效率之外,LinkedList实现还可以让您进入标准库,打开代码以获得更大的灵活性并让您减少编写.

这应该能够处理Pop,Push和Remove

    public class FIFOStack<T> : LinkedList<T>
    {
        public T Pop()
        {
            T first = First();
            RemoveFirst();
            return first;
        }

        public void Push(T object)
        {
            AddFirst(object);
        }

        //Remove(T object) implemented in LinkedList
   }
Run Code Online (Sandbox Code Playgroud)


tva*_*son 5

也许扩展方法可行,但我怀疑完全需要完全不同的数据结构.

public static T Remove<T>( this Stack<T> stack, T element )
{
     T obj = stack.Pop();
     if (obj.Equals(element))
     {
         return obj;
     }
     else
     {
        T toReturn = stack.Remove( element );
        stack.Push(obj);
        return toReturn;
     }
}
Run Code Online (Sandbox Code Playgroud)