c# stack queue combination

前端 未结 5 1698
南方客
南方客 2020-12-29 23:25

is there in C# some already defined generic container which can be used as Stack and as Queue at the same time? I just want to be able to append elements either to the end,

相关标签:
5条回答
  • 2020-12-30 00:08

    Good old List<T> will do it.

    Add() to enqueue, Insert(0,T) to push, Remove(0) to pop/dequeue.

    0 讨论(0)
  • 2020-12-30 00:09

    Check the LinkedList class.

    LinkedList<int> list = new LinkedList<int>();
    
    list.AddFirst(1);
    list.AddLast(2);
    list.AddFirst(0);
    
    0 讨论(0)
  • 2020-12-30 00:10

    Here's my implementation of an immutable deque:

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

    Notice that this is an immutable double-ended-queue. Normally you probably think of a queue as something you mutate:

    queue.Enqueue(10);
    

    An immutable queue always stays the same; when you add a new element, it gives you back an entirely new queue, so you use it as:

    queue = queue.Enqueue(10);
    

    if you no longer care about the old value.

    0 讨论(0)
  • 2020-12-30 00:15

    What you want is a linked list - there's one in the BCL - that has AddFirst and AddLast methods

    0 讨论(0)
  • 2020-12-30 00:24

    Here's a class to help people implement this easily:

    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;
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题