如果我的问题与本网站无关,我很抱歉。
我需要删除队列的最后一个元素。 我可以使用的唯一操作是Peek() - 获取第一个元素而不删除它,Enqueue(元素) - 将一个元素插入队列的后面,Dequeue() - 删除第一个元素和IsEmpty() - true或false队列是否为空。 我不能使用任何数组或队列来帮助我,并且元素的数量不可用。
现在,我想到了一些解决方案,但每次我都遇到困难,因为我不知道如何判断当前元素是否是最后一个元素。
提前致谢。再次,对不起,如果这不是这类问题的正确位置。
答案 0 :(得分:8)
Justin Beal's solution更直接。但我认为它可以在不创建另一个队列的情况下完成。
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;
}
答案 1 :(得分:4)
每次我卡住,因为我不知道如何判断当前元素是否是最后一个元素。
好。由于你不知道“当前”元素是最后一个,你做知道“previous”元素是最后一个。
因此,通过保存前一个元素,您应该能够处理这个问题。
答案 2 :(得分:2)
这样的事情会起作用:
public Queue removeLast(Queue queue1){
Queue queue2 = new Queue();
while(!queue1.isEmpty()){
Object o = queue1.dequeue();
if(!queue1.isEmpty()){
queue2.enqueue(o);
}
}
return queue2;
}
答案 3 :(得分:1)
我有相同的要求所以创建了一个扩展方法,其他人可以使用,如果谷歌到达这里。
using System.Collections.Generic;
using System.Linq;
/// <summary>
/// Extensions for <see cref="System.Collections.Generic.Queue{T}"/>.
/// </summary>
public static class QueueExtensionsStatic
{
/// <summary>
/// Removes the last item from the <see cref="System.Collections.Generic.Queue{T}"/>.
/// </summary>
/// <typeparam name="T">Type of object in <see cref="System.Collections.Generic.Queue{T}"/>.</typeparam>
/// <param name="q">Instance of <see cref="System.Collections.Generic.Queue{T}"/> to remove item from.</param>
/// <returns>Item removed from the <see cref="System.Collections.Generic.Queue{T}"/>.</returns>
public static T Pop<T>(this Queue<T> q)
{
for (var i = 1; i < q.Count; i++)
q.Enqueue(q.Dequeue());
return q.Dequeue();
}
/// <summary>
/// Removes the last <see cref="quantity"/> item(s) from the <see cref="System.Collections.Generic.Queue{T}"/>.
/// </summary>
/// <typeparam name="T">Type of object in <see cref="System.Collections.Generic.Queue{T}"/>.</typeparam>
/// <param name="q">Instance of <see cref="System.Collections.Generic.Queue{T}"/> to remove item from.</param>
/// <param name="quantity">Number of items to pop off the end of the <see cref="System.Collections.Generic.Queue{T}"/>.</param>
/// <returns>Item removed from the <see cref="System.Collections.Generic.Queue{T}"/>.</returns>
public static IEnumerable<T> Pop<T>(this Queue<T> q, int quantity)
{
for (var i = quantity; i < q.Count; i++)
q.Enqueue(q.Dequeue());
var poppedItems = new List<T>(quantity);
for (int i = 0; i < quantity; i++)
poppedItems.Add(q.Dequeue());
return poppedItems;
}
/// <summary>
/// Adds an item(<see cref="T"/>) to the start of the <see cref="System.Collections.Generic.Queue{T}"/>.
/// </summary>
/// <typeparam name="T">Type of object in <see cref="System.Collections.Generic.Queue{T}"/>.</typeparam>
/// <param name="q">Instance of <see cref="System.Collections.Generic.Queue{T}"/> to remove item from.</param>
public static void Push<T>(this Queue<T> q, T item)
{
q.Enqueue(item);
for (var i = 1; i < q.Count; i++)
q.Enqueue(q.Dequeue());
}
/// <summary>
/// Adds items(<see cref="T"/>) to the start of the <see cref="System.Collections.Generic.Queue{T}"/>.
/// </summary>
/// <typeparam name="T">Type of object in <see cref="System.Collections.Generic.Queue{T}"/>.</typeparam>
/// <param name="q">Instance of <see cref="System.Collections.Generic.Queue{T}"/> to remove item from.</param>
/// <param name="items">List of items(<see cref="T"/>) to add to the <see cref="System.Collections.Generic.Queue{T}"/>.</param>
public static void Push<T>(this Queue<T> q, IEnumerable<T> items)
{
if (items == null || !items.Any()) return;
foreach (var item in items)
q.Enqueue(item);
for (var i = items.Count(); i < q.Count; i++)
q.Enqueue(q.Dequeue());
}
}
答案 4 :(得分:0)
我完成了特立尼达提供的解决方案,这是迄今为止投票最多的答案。我猜这个解决方案只有在队列中的第一个元素/对象是唯一的时才能完美运行。如果遇到第一个元素/对象的任何重复,则无法将正确的元素作为最后一个元素。
答案 5 :(得分:0)
几天前,我在执行类似的任务要求时遇到了同样的问题。我认为,解决此问题的最简单方法是遍历队列并将“ front”元素推到队列的后面并“弹出”,但是当您到达队列中的最后一个元素时,只需“弹出”并不要” t“推”它。