??????????????????Stack<T>???????T[] _array??????????????????????????Stack()????????????????????些???????????????????????????喂????????????_array??????????T[0]?????????_size??????0?????_size?????????????????写????????????????械????????????卤???????????????????????????位?谩?
?????????????????Push(T item)???????????????????????????????????卸???卸???_array????????????????????????????????????????????????.NET???????????????????????????????_array?????????????????????????4????new T[4]???????????????5????????????????????????????????渭?T[] array???????????????_array??????2??????????_array??????????????渭?array?校???_array??????array????????????????????????????????????械??????????????????????????????????????Copy(_array??array)??????????????????????????.NET????械??????????????.NET???????????Array.Copy(this._array?? 0?? array?? 0?? this._size)????????????????????C++????????楦�???????????????????????????????????????

?????????????Pop()?????????????????卸?????????????????0??小?????0???????????????_size-=1??????Pop????????????位?谩????_array[_size]??????default(T)???_array[_size]??位??????????????????????????????????????????????????????????????????????????谩????????Pop()????????????
?????????????????????Stack<T>????????????????????????????????????????????锟�??????????胁???100????????味???????????4->8->16->32->64->128???5?蔚?????????????????????????????????????????械??.NET???Stack<T>???????????????喂????????????????Stack(int capacity)?????????capacity??????????????????????????????????????????????尾???????????????????????100??????????????????new Stack<T>(100)??????????????????????????????????Stack??????????
????Queue<T>?????
????Queue?????校????????????????????????泻??????????????Enqueue????????Dequeue??????????????????????????????????????Stack<T>????????????????Queue<T>???????????????????????????????????T[] _array????????????????????2???????????????????????????芯?????????????????????????????Stack<T>??????????_size?????尾???卤????斜???????????_head?卤???????尾_tail?卤???????????????????????????械?娲⑿�??????????婕�????????械?????????Queue<T>???????Stack<T>????????些???????????????姹�??????
using System;
namespace OriginalCode
{
/// <summary>
/// ????.NET??????????
/// </summary>
public class Queue<T>
{
private static T[] EMPTY_ARRAY = new T[0];
private const int _defaultCapacity = 4;
private T[] _array;
private int _head; //?位??
private int _tail; //尾位??
private int _size; //??????????
public Queue()
{
_array = EMPTY_ARRAY;
_head = 0;
_tail = 0;
_size = 0;
}
public Queue(int capacity)
{
_array = new T[capacity];
_head = 0;
_tail = 0;
_size = 0;
}
/// <summary>
/// ??????
/// </summary>
/// <param name="item">????????</param>
public void Enqueue(T item)
{
if (_size == _array.Length)
{
//??????????????小
int capacity = _array.Length * 2;
if (capacity < _array.Length + _defaultCapacity)
{
//.NET????????????些????????
//??????????????Queue(int capacity)????????? capacity????=1 | 2 | 3
//????????+4???卸? ?????????????????? ???绲眂apacity = 1????? *2 = 2 ????2??????????????????
//????????芯?效???????? ?械????????????
capacity = _array.Length + _defaultCapacity;
}
//?????????????????????
T[] array = new T[capacity];
if (_size > 0)
{
//????????路?????????????? ??????????械????? ?????_head???????_tail
//???????_array[_head]??_array[_size-1] ????? ??????array[0]...[_size - _head - 1]
ArrayCopy(_array?? array?? 0?? _head?? _size - _head);
//???????_array[0]??_array[_head-1] ????? ??????array[_size - _head]...[_size - 1]
ArrayCopy(_array?? array?? _size - _head?? 0?? _head);
}
_array = array; //?????????????????
_head = 0; //??????位??????0
_tail = _size; //?????尾位??????_size
}
_array[_tail] = item;
_tail = (_tail + 1) % _array.Length;
_size += 1;
}
/// <summary>
/// ???????
/// </summary>
/// <returns>???????</returns>
public T Dequeue()
{
if (_size == 0)
{
throw new Exception("?????????? ??????谐??????");
}
T result = _array[_head];
_array[_head] = default(T);
_head = (_head + 1) % _array.Length;
_size -= 1;
return result;
}
/// <summary>
/// ????????????????????(?????????????????????????.NET???????C++????????效?????)
/// </summary>
/// <param name="oldArray">??????</param>
/// <param name="newArray">??????</param>
/// <param name="newArrayBeginIndex">??????????卤?</param>
/// <param name="oldArrayBeginIndex">??????????卤?</param>
/// <param name="copyCount">???????</param>
private void ArrayCopy(T[] oldArray?? T[] newArray?? int newArrayBeginIndex?? int oldArrayBeginIndex?? int copyCount)
{
for (int i = oldArrayBeginIndex?? j = newArrayBeginIndex; i < oldArrayBeginIndex + copyCount; i++??j++)
{
newArray[j] = oldArray[i];
}
}
}
}