除了案例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);
}
}
}
答案 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