从队列列表中删除最后一个元素

时间:2015-05-13 16:06:17

标签: c#

除了案例2之外,一切正常。在案例2中,我试图从队列中删除最后一个元素,因为默认情况下它从开头删除。我试图制作一个反向列表,然后在删除后将其恢复正常但它似乎没有工作。这是完整的代码:

namespace _4
    {
    class Program
      {
      static void Main(string[] args)
      {
      Queue<string> que = new Queue<string>();
      int menu;

     do
        {
            Console.WriteLine("1 - Add element");
            Console.WriteLine("2 - Remove last element");
            Console.WriteLine("3 - Find element");
            Console.WriteLine("4 - Info");
            Console.WriteLine("5 - Clear");
            Console.WriteLine("0 - Exit");

            Console.Write("Menu: ");
            menu = Convert.ToInt32(Console.ReadLine());

            switch (menu)
            {
                case 1:
                {
                    Console.Write("How much elements?");

                    int cik = Convert.ToInt32(Console.ReadLine());

                    for (int i = 0; i < cik; i++)
                    {
                        Console.Write("How much elements?: ");
                        string cipars = Console.ReadLine();

                        que.Enqueue(cipars);
                    }

                    Console.WriteLine();
                }
                break;

                case 2: // nestrada
                {
                    Console.Write("How much elements starting from last?");
                    int skaits = Convert.ToInt32(Console.ReadLine());

                    que.Reverse();

                    for (int i = 0; i < skaits; i++)
                    {
                        que.Dequeue();
                    }

                    que.Reverse();


                    Console.WriteLine();
                }
                break;
                case 3:
                {
                    Console.Write("Ievadiet elementu: ");
                    string elements = Console.ReadLine();

                    int numurs = 0;

                    if (que.Contains(elements))
                    {
                        foreach (string item in que)
                        {
                            if (item==elements)
                            {
                                Console.WriteLine("Elementa index ir {0}",numurs);
                            }
                            numurs++;
                        }
                    Console.WriteLine();
                    }

                    else
                    {
                        Console.WriteLine("shada elementa nav.");
                    }
                }
                break;
                case 4:
                {
                    Console.WriteLine("Elementu skaits: {0}",que.Count);
                    Console.WriteLine();
                    foreach (var item in que)
                    {
                        Console.WriteLine(item);
                    }
                }
                break;
                case 5:
                {
                    que.Clear();
                }
                break;
            }
        } while (menu != 0);


    }
}

}

5 个答案:

答案 0 :(得分:2)

您是否考虑过双端队列?实施可以是this

但是,你可以在下面做的就地获得第一个元素

object RemoveLast(Queue q) {
object first = q.Peek();
object current = null;
while (true) {
    current = q.Dequeue();
    if (q.Peek() == first) {
        break;
    }
    q.Enqueue(current);
}
return current;
}
找到

功能here

答案 1 :(得分:1)

Reverse()是LINQ方法,而不是Queue类提供的方法。它使用Queue作为IEnumerable输入序列,并返回 new IEnumerable,其元素顺序相反。

因此,调用que.Reverse()将在您的代码中完全(甚至不会浪费CPU周期)。

您无法从队列中删除最后一个元素。你唯一能做的就是创建一个新的队列,从中省略最后一个元素。

que = new Queue<string>(que.Take(queue.Count - 1));

效率非常低,如果可能没有更好的方法来实现您的目标,您可能需要三思而行。

答案 2 :(得分:0)

反向是一个功能。您必须将新队列分配给变量并使用新变量。

var reveredQueue = que.Reverse();

如果你想从双方删除条目,我不会使用队列。尝试使用数组。

答案 3 :(得分:0)

我刚刚在Queue类中使用了四种扩展方法来回答这个问题:https://stackoverflow.com/a/34862509/2634050 也许你不应该首先使用队列,但对于我的用例,我必须保持现有代码不变。

答案 4 :(得分:0)

你应该使用LIFO的Stack(T)类,检查Push()和Pop()方法。 它可能会帮助你。 https://msdn.microsoft.com/library/3278tedw(v=vs.110).aspx