2010-12-07 8 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

관련 문제