c#栈队列组合

Posted

技术标签:

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

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

谢谢

【问题讨论】:

【参考方案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 中有一个 - 具有 AddFirst 和 AddLast 方法

【讨论】:

【参考方案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)。

以上是关于c#栈队列组合的主要内容,如果未能解决你的问题,请参考以下文章

Python全栈开发——类继承和组合

根据组合框选择 C# 更改组合框值

SOA 组合未从 JMS 队列中读取

python全栈学习--Day19(面向对象组合,继承)

C#设计模式09——组合模式的写法

UESTC1013-我的魔法栈-模拟/排列组合