1、Queue声明创建对象。(Queue为泛型对象。)
@H_301_19@public class Queue<T> :IEnumerable<T>,System.Collections.ICollection,IReadOnlyCollection<T>
本质为Array对象存储数据。
@H_301_19@Queue<string> qy = new Queue<string>();
private T[] _array
public Queue()
{
_array = Array.Empty<T>();
}
Queue<int> qy1 = int>(12);
public Queue(int capacity)
{
if (capacity < 0)
throw new ArgumentOutOfRangeException(nameof(capacity),capacity,SR.ArgumentOutOfRange_NeedNonNegNum);
_array = T[capacity];
}
@H_301_19@Queue<int> qy2 = int>(new List<int>());
public Queue(IEnumerable<T> collection)
{
if (collection == null)
new ArgumentNullException(nameof(collection));
_array = EnumerableHelpers.ToArray(collection,out _size);
if (_size != _array.Length) _tail = _size;
}
@H_301_19@
2、队列的空间是实际存储值的两倍,如果小于两倍则每次增场4的长度。
@H_301_19@1 if (_size == _array.Length)
2 {
3 int newcapacity = (int)((long)_array.Length * (long)GrowFactor / 1004 if (newcapacity < _array.Length + MinimumGrow)
5 {
6 newcapacity = _array.Length + MinimumGrow;
7 }
8 SetCapacity(newcapacity);
9 }
3、Queue为先进先出。
进队列在数组末尾赋值
@H_301_19@ void Enqueue(T item)
{
_array.Length)
{
);
MinimumGrow)
{
newcapacity = _array.Length + MinimumGrow;
}
SetCapacity(newcapacity);
}
_array[_tail] = item;
MoveNext(ref _tail);
_size++;
_version++;
}
出队列则从头部取值
@H_301_19@ T Dequeue()
{
int head = _head;
T[] array = _array;
if (_size == )
{
ThrowForEmptyQueue();
}
T removed = array[head];
if (RuntimeHelpers.IsReferenceOrContainsReferences<T>())
{
array[head] = default!;
}
MoveNext( _head);
_size--;
return removed;
}
4、TryDequeue 与 Dequeue()区别在于 TryDequeue 判断size为0时,返回false 并out 泛型的默认值
@H_301_19@ bool TryDequeue([MaybeNullWhen(false)] out T result)
{
)
{
result = ;
return false;
}
result =true;
}
注:MaybeNullWhenAttribute(Boolean) 返回值条件。 如果方法返回此值,则关联的参数可能为 null
5、Peek 仅仅时查看一下下一个要返回的值,不从数组移除
随是拙见,但为原创,转载注明出处,敬谢
Queue 常用的方法大约就这些。先写道这里,碎觉。
以下为公众号,一起学起来~