【问题标题】:c# stack queue combinationc#栈队列组合
【发布时间】:2010-12-20 09:06:23
【问题描述】:

在 C# 中是否有一些已经定义的通用容器可以同时用作堆栈和队列? 我只想能够将元素附加到队列的末尾或队列的前面

谢谢

【问题讨论】:

    标签: c# stack queue containers


    【解决方案1】:

    检查LinkedList 类。

    LinkedList<int> list = new LinkedList<int>();
    
    list.AddFirst(1);
    list.AddLast(2);
    list.AddFirst(0);
    

    【讨论】:

      【解决方案2】:

      这是我的不可变双端队列的实现:

      http://blogs.msdn.com/ericlippert/archive/2008/02/12/immutability-in-c-part-eleven-a-working-double-ended-queue.aspx

      注意这是一个不可变双端队列。通常你可能认为队列是你改变的东西:

      queue.Enqueue(10);
      

      不可变队列始终保持不变;当您添加一个新元素时,它会返回一个全新的队列,因此您可以将其用作:

      queue = queue.Enqueue(10);
      

      如果您不再关心旧值。

      【讨论】:

      • 恕我直言,这似乎无法回答他的问题。
      • 该链接有一个类,它定义了 OP 正在寻找什么。这个答案中给出的例子并没有真正表明这一点。
      • StriplingWarrior,我不知道你在说什么。海报要求一个现有的通用容器,其作用类似于堆栈或队列。这样的容器称为“双端队列”,我提供了一个指向源代码的链接以实现此类容器。问题的哪一部分没有得到回答?
      • DeQueue 在这里是正确的名称,LinkedList 是 DeQueue 的一种可能实现。
      【解决方案3】:

      您想要的是 linked list - BCL 中有一个 - 具有 AddFirstAddLast 方法

      【讨论】:

        【解决方案4】:

        这里有一个类可以帮助人们轻松实现这一点:

        public class StackQueue<T>
        {
            private LinkedList<T> linkedList = new LinkedList<T>();
        
            public void Push(T obj)
            {
                this.linkedList.AddFirst(obj);
            }
        
            public void Enqueue(T obj)
            {
                this.linkedList.AddFirst(obj);
            }
        
            public T Pop()
            {
                var obj = this.linkedList.First.Value;
                this.linkedList.RemoveFirst();
                return obj;
            }
        
            public T Dequeue()
            {
                var obj = this.linkedList.Last.Value;
                this.linkedList.RemoveLast();
                return obj;
            }
        
            public T PeekStack()
            {
                return this.linkedList.First.Value;
            }
        
            public T PeekQueue()
            {
                return this.linkedList.Last.Value;
            }
        
            public int Count
            {
                get
                {
                    return this.linkedList.Count;
                }
            }
        }
        

        【讨论】:

        • 不应该Enqueue(T obj)方法调用AddLast而不是AddFirst
        • @YehorHromadskyi 它被实现为在链表的前面入队并在后面出队。我没有发现任何错误,但如果我遗漏了什么,请告诉我。
        • 你是对的,我的错,很抱歉造成混乱。
        • @YehorHromadskyi 没问题!
        【解决方案5】:

        好老的List&lt;T&gt; 会做到的。

        Add() 入队,Insert(0,T) 推送,Remove(0) 弹出/出队。

        【讨论】:

        • 插入和删除都是 O(n) 操作。一个链表将是 O(1)
        • 酷 - 我的第一次投反对票。感谢您指出 O(n)。但是要挑剔,不是只有 O(n) 插入到 List 的前面而不是插入到末尾(因为它是基于数组的)吗?
        • 这取决于您所指的费用。您是在谈论摊销成本,还是最坏的单一案例成本?将 n 项插入双时满列表末尾的摊销成本为 O(1)。将一个项目插入一个包含 n 个项目的 double-when-full 列表的最坏情况成本是 O(n)。
        猜你喜欢
        • 1970-01-01
        • 2020-06-12
        • 2013-09-30
        • 1970-01-01
        • 2014-10-14
        • 2017-04-12
        • 1970-01-01
        • 2012-01-08
        • 2021-03-17
        相关资源
        最近更新 更多