C# 从队列列表中删除最后一个元素
除了第二种情况外,一切正常。在案例2中,我试图从队列中删除最后一个元素,因为默认情况下,它是从一开始就删除的。我试着制作一个反向列表,然后在删除后将其反向恢复到正常状态,但它似乎不起作用。以下是全部代码:C# 从队列列表中删除最后一个元素,c#,C#,除了第二种情况外,一切正常。在案例2中,我试图从队列中删除最后一个元素,因为默认情况下,它是从一开始就删除的。我试着制作一个反向列表,然后在删除后将其反向恢复到正常状态,但它似乎不起作用。以下是全部代码: namespace _4 { class Program { static void Main(string[] args) { Queue<string> que = new Queue<string>(
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);
}
}
namespace\u 4
{
班级计划
{
静态void Main(字符串[]参数)
{
Queue que=新队列();
int菜单;
做
{
Console.WriteLine(“1-添加元素”);
Console.WriteLine(“2-删除最后一个元素”);
Console.WriteLine(“3-查找元素”);
Console.WriteLine(“4-信息”);
控制台。写入线(“5-清除”);
控制台写入线(“0-退出”);
控制台。写入(“菜单:”);
menu=Convert.ToInt32(Console.ReadLine());
开关(菜单)
{
案例1:
{
控制台。写(“有多少元素?”);
int cik=Convert.ToInt32(Console.ReadLine());
对于(int i=0;i
}反转是一种功能。您必须将新队列分配给变量并使用新变量 var reveredQueue=que.Reverse() 如果要从两侧删除条目,我不会使用队列。尝试使用数组。
Reverse()
是LINQ方法,而不是队列
类提供的方法。它使用队列
作为IEnumerable
输入序列,并返回一个新的IEnumerable
,元素顺序颠倒
因此,调用que.Reverse()
在代码中完全不会做任何事情(甚至不会浪费CPU周期)
不能从队列中删除最后一个元素。您唯一能做的就是创建一个新队列,从中省略最后一个元素
que = new Queue<string>(que.Take(queue.Count - 1));
que=新队列(que.Take(Queue.Count-1));
这是非常低效的,如果没有更好的方法来实现您的目标,您可能需要三思。您考虑过双端队列吗?实现可以是 但是,您可以执行以下操作来获得第一个元素
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;
}
function found我刚才用Queue类上的四种扩展方法回答了这个问题: 同样,也许您不应该首先使用队列,但对于我的用例,我必须保持现有代码不变。您应该使用堆栈(T)类,即后进先出,检查Push()和Pop()方法。 这可能对你有帮助。
“似乎不起作用”…它到底是怎么不起作用的?它一点也不倒转。它只是从列表中删除第一个元素。p、 这就是为什么我在这个话题上总是被扣掉分数?我做错了什么?你的
Reverse
方法是否改变了列表或返回了一个新的列表,并且删除了Begging元素?如果你想访问队列末尾的项目,你首先不应该使用队列;您应该使用设计为从两端进行操作的数据结构,例如Deque。