2010-12-07 1 views
0

私はスタックが一番簡単な方法だと知っていますが、何もデキューすることなくキューの最後の要素を取得することは可能でしょうか?キュー内の最後の要素を取得する方法はありますか?

+0

はなぜだけでなく、スタックを維持していませんか? – Kakira

+0

[キュー内の最初と最後のアイテムをどのように取得するのですか?](http://stackoverflow.com/questions/1308186/how-would-you-obtain-the-first-and-last-items- in-a-queue) – nawfal

答えて

0

あなたは使用することができますLINQの(myQueueがあなたのキューの名前です)Enumerable.Last() method

var lastElement = myQueue.Last(); 

他の人が言及したようにあなた自身が、多くの場合、これを実行する必要が見つけた場合、あなたはおそらく使用して考えるようにしたいが、異なるデータ構造。たとえば、List<T>

var myElement = myList[myList.Length - 1]; 
0

はありません、あなたはこれを行うために(ToListまたはToArrayを使用して)他のいくつかのコレクションにキューを変換する必要があります。これにより、キュー内のすべてを効率的にデキューします。

キューから最後のアイテムを必要とすることで、誤ったコレクションを使用してデータを保持していることが実証されています。コレクションを必要なすべての操作を提供する別のタイプに変更することを検討してください。

0

キューはその操作を高速にするように設定されていないため、できることはO(n)です。あなたはSystem.Linqのをインポートする場合

、あなたが書くことができます。 myQueue.Last()

2

をあなたは、単に行うことができます。

// Assumes T is a reference type, if it's a value type, then 
// you will get an instance with the bits zeroed out. 
T item = queue.LastOrDefault(); 

ここでの問題は、すべての時間はあなたがキュー内の最後の項目を取得したいということですキュー内のすべてのアイテムをまで繰り返す必要があります。

キューの最初と最後の要素にアクセスすることが重要な場合は、double-ended queueと考えてください。

1

あなたが本当にあなたに必要がある場合は、これを使用するが、異なるデータ構造を使用することを検討することができます

public static class QueueExtensions<T> 
{ 
    const BindingFlags _flags = 
     BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance; 

    private static readonly FieldInfo _array = 
     typeof(Queue<T>).GetField("_array", _flags); 

    private static readonly FieldInfo _size = 
     typeof(Queue<T>).GetField("_size", _flags); 

    public T LastItem(this Queue<T> value) 
    { 
     if (value == null) 
      throw new ArgumentNullException("value"); 
     if (value.Count == 0) 
      throw new ArgumentException("The queue cannot be empty.", "value"); 
     var array = (T[])_array.GetValue(value); 
     var size = (int)_size.GetValue(value); 
     return array[size - 1]; 
    } 
} 
+0

-1、申し訳ありませんが、私はこのような内部実装の詳細を頼りにすることはできません。それはあまりにも脆いです。 IMOの方が良い選択肢は、ダブルエンドアクセスを可能にする異なる構造( 'List 'のようなもの)を使用することです。 – casperOne

+2

@casperOne - 私が私の答えで述べたように。 – ChaosPandion

+0

それは動作しません。 Resharperまたは同様に 'Queue 'の実装を参照してください。 - '_size'は最後の要素がどこにあるかを示していません。代わりに、 'int _tail'フィールドがあります。これは最後の要素がどこにあるのかを指示します。そして、 '_tail-1'はキュー内に要素がある間に' _tail'が0になる可能性があるので、どちらも動作しません。 Queue(of T)は効果的ですがトリッキーな実装をしています。これは、Dequeueの配列全体で要素を移動させないため、本当に必死でない限り、Reflectionパスをお勧めしません。 – Mikha

関連する問題