代码之家  ›  专栏  ›  技术社区  ›  annakata

C 2.0中的堆栈集合缺少移位和取消移位

  •  3
  • annakata  · 技术社区  · 16 年前

    奇怪的是,堆栈集合似乎缺少相当基本的shift和unshift方法*,我正在2.0中工作,所以我不能仅仅扩展它们。

    是否有任何合理的技术或可选的集合类来获取这些方法?我也需要推和弹出。

    编辑:看起来我想要的收藏确实是 deque 很高兴这不是C:(

    现在不能使用第三方库,所以我将使用笨拙的LinkedList(我说笨重,因为读和删除是两种操作,其中转换是一种操作),但我想我建议任何可以使用它的人使用PowerCollections方法。或者更好的是,升级到扩展方法。

    叹息


    *抱歉,我不知道这些是不常见的术语,我只是不知道在API中从哪里找到它们。供参考:

    移位=删除第一个元素

    unshift=在集合开始处插入元素

    7 回复  |  直到 12 年前
        1
  •  14
  •   Marc Gravell    16 年前

    我会说使用 LinkedList<T> .它有从前面添加和删除以及从后面添加和删除的方法。我从来没有听说过移动和不移动,但我假设这就是它的意思。

        2
  •  9
  •   Adam Robinson    16 年前

    从未听说过堆栈中的移位/不移位。堆栈类提供 Pop , Peek Push 不过。

        3
  •  6
  •   Andrew Moore    16 年前

    如果需要shift/unshift方法,则使用的类是错误的。一 stack 是后进先出(LIFO)数据结构。

    如果要在不弹出和按下的情况下移动/取消移动,请使用 Queue . 如果您两者都要,我建议使用 Deque PowerCollections 图书馆

        4
  •  1
  •   Community Mohan Dere    8 年前

    你可以 fake extension methods 只要你使用的是C 3.0,目标是2.0。

    您能描述一下移位/取消移位操作是什么吗?

        5
  •  1
  •   ruslander    16 年前

    根据定义 类表示使用后进先出(LIFO)技术添加和删除元素来管理集合中元素的方法。后进先出简单地说,添加到集合中的最后一个元素将自动是删除的第一个元素。

    您希望从中获得的功能是定制的,但可以通过以下方式轻松实现

    public class MyStack<T>:Stack<T>{
      public void Shift(T item){
         // load stack into internal ordered list
         // clear stack content
         // insert into internal list at desired location
         // populate stack with content from internal list
      }
      public void Unshift(T item){
         // load stack into internal ordered list
         // clear stack content
         // insert into internal list at desired location
         // populate stack with content from internal list
      }
    }
    

    似乎这就是一切:)

        6
  •  1
  •   Gauthier    12 年前

    这并不是最好的,但它接近于一个带有shift/unshift和push/pop的javascript数组。它不会隐藏内部工作,您可以索引任何需要的项目。不过,我有基本的功能。

     public class JSList<T> : List<T>
    {
        public JSList() : base() {}
    
        /// <summary>
        /// this the add item to the start of the list
        /// </summary>
        /// <param name="v"></param>
        public void Shift(T v)
        {
            this.Insert(0, v);
        }
    
        /// <summary>
        /// remove item at the start of the list
        /// </summary>
        /// <returns></returns>
        public T Unshift()
        {
            var toreturn = default(T);
            if (this.Count > 0)
            {
                toreturn = this[0];
                this.RemoveAt(0);
            }
            return toreturn;
        }
    
        /// <summary>
        /// Adds object to end of the list
        /// </summary>
        /// <param name="v"></param>
        public void Push(T v)
        {
            this.Add(v);
        }
    
        /// <summary>
        /// removes an item at the end of the list
        /// </summary>
        /// <returns></returns>
        public T Pop()
        {
            var toreturn = default(T);
            if (this.Count > 0)
            {
                toreturn = this[this.Count - 1];
                this.RemoveAt(this.Count - 1);
            }
            return toreturn;
        }
    
        public T Peek()
        {
            return this[this.Count - 1];
        }
    }
    
        7
  •  0
  •   DonkeyMaster    16 年前
    Shift ==> Stack.Pop
    Unshift ==> Stack.Push
    

    Unshift 不返回堆栈中元素的数目,您有 Stack.Count 属性。

    还有,有 Stack.Peek ,获取第一个元素而不移除它。

    Stack<T> class

    推荐文章