Реализация класса "Стек" - C#

Узнай цену своей работы

Формулировка задачи:

Требуется собственноручно реализовать класс Стек.Имеется часть кода:
class Stek
int []m=new int[4];
int count=0;
public void Add(int e)
{
if(m.Length==count)
{int[]t=new int[count+4];
for(int i=0; i<count;i++)
t[i]=m[i];
m=t;
}
 
m[count++]=e;
.......
не совсем пойму,как это работает и чего не хватает... п.с. относительно недавно начал изучать программирование,потому я в этом деле пока,к сожалению, полный дилетант.надеюсь на вашу помощь.

Решение задачи: «Реализация класса "Стек"»

textual
Листинг программы
[Serializable, DebuggerDisplay("Count = {Count}"), DebuggerTypeProxy(typeof(System_StackDebugView<>)), ComVisible(false)]
public class Stack<T> : IEnumerable<T>, ICollection, IEnumerable
{
    // Fields
    private T[] _array;
    private const int _defaultCapacity = 4;
    private static T[] _emptyArray;
    private int _size;
    [NonSerialized]
    private object _syncRoot;
    private int _version;
 
    // Methods
    static Stack()
    {
        Stack<T>._emptyArray = new T[0];
    }
 
    public Stack()
    {
        this._array = Stack<T>._emptyArray;
        this._size = 0;
        this._version = 0;
    }
 
    public Stack(IEnumerable<T> collection)
    {
        if (collection == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.collection);
        }
        ICollection<T> is2 = collection as ICollection<T>;
        if (is2 != null)
        {
            int count = is2.Count;
            this._array = new T[count];
            is2.CopyTo(this._array, 0);
            this._size = count;
        }
        else
        {
            this._size = 0;
            this._array = new T[4];
            using (IEnumerator<T> enumerator = collection.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    this.Push(enumerator.Current);
                }
            }
        }
    }
 
    public Stack(int capacity)
    {
        if (capacity < 0)
        {
            ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.capacity, ExceptionResource.ArgumentOutOfRange_NeedNonNegNumRequired);
        }
        this._array = new T[capacity];
        this._size = 0;
        this._version = 0;
    }
 
    public void Clear()
    {
        Array.Clear(this._array, 0, this._size);
        this._size = 0;
        this._version++;
    }
 
    public bool Contains(T item)
    {
        int index = this._size;
        EqualityComparer<T> comparer = EqualityComparer<T>.Default;
        while (index-- > 0)
        {
            if (item == null)
            {
                if (this._array[index] == null)
                {
                    return true;
                }
            }
            else if ((this._array[index] != null) && comparer.Equals(this._array[index], item))
            {
                return true;
            }
        }
        return false;
    }
 
    public void CopyTo(T[] array, int arrayIndex)
    {
        if (array == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.array);
        }
        if ((arrayIndex < 0) || (arrayIndex > array.Length))
        {
            ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.arrayIndex, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum);
        }
        if ((array.Length - arrayIndex) < this._size)
        {
            ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidOffLen);
        }
        Array.Copy(this._array, 0, array, arrayIndex, this._size);
        Array.Reverse(array, arrayIndex, this._size);
    }
 
    public Enumerator<T> GetEnumerator()
    {
        return new Enumerator<T>((Stack<T>) this);
    }
 
    public T Peek()
    {
        if (this._size == 0)
        {
            ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EmptyStack);
        }
        return this._array[this._size - 1];
    }
 
    public T Pop()
    {
        if (this._size == 0)
        {
            ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EmptyStack);
        }
        this._version++;
        T local = this._array[--this._size];
        this._array[this._size] = default(T);
        return local;
    }
 
    public void Push(T item)
    {
        if (this._size == this._array.Length)
        {
            T[] destinationArray = new T[(this._array.Length == 0) ? 4 : (2 * this._array.Length)];
            Array.Copy(this._array, 0, destinationArray, 0, this._size);
            this._array = destinationArray;
        }
        this._array[this._size++] = item;
        this._version++;
    }
 
    IEnumerator<T> IEnumerable<T>.GetEnumerator()
    {
        return new Enumerator<T>((Stack<T>) this);
    }
 
    void ICollection.CopyTo(Array array, int arrayIndex)
    {
        if (array == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.array);
        }
        if (array.Rank != 1)
        {
            ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_RankMultiDimNotSupported);
        }
        if (array.GetLowerBound(0) != 0)
        {
            ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_NonZeroLowerBound);
        }
        if ((arrayIndex < 0) || (arrayIndex > array.Length))
        {
            ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.arrayIndex, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum);
        }
        if ((array.Length - arrayIndex) < this._size)
        {
            ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidOffLen);
        }
        try
        {
            Array.Copy(this._array, 0, array, arrayIndex, this._size);
            Array.Reverse(array, arrayIndex, this._size);
        }
        catch (ArrayTypeMismatchException)
        {
            ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidArrayType);
        }
    }
 
    IEnumerator IEnumerable.GetEnumerator()
    {
        return new Enumerator<T>((Stack<T>) this);
    }
 
    public T[] ToArray()
    {
        T[] localArray = new T[this._size];
        for (int i = 0; i < this._size; i++)
        {
            localArray[i] = this._array[(this._size - i) - 1];
        }
        return localArray;
    }
 
    public void TrimExcess()
    {
        int num = (int) (this._array.Length * 0.9);
        if (this._size < num)
        {
            T[] destinationArray = new T[this._size];
            Array.Copy(this._array, 0, destinationArray, 0, this._size);
            this._array = destinationArray;
            this._version++;
        }
    }
 
    // Properties
    public int Count
    {
        [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
        get
        {
            return this._size;
        }
    }
 
    bool ICollection.IsSynchronized
    {
        get
        {
            return false;
        }
    }
 
    object ICollection.SyncRoot
    {
        get
        {
            if (this._syncRoot == null)
            {
                Interlocked.CompareExchange<object>(ref this._syncRoot, new object(), null);
            }
            return this._syncRoot;
        }
    }
 
    // Nested Types
    [Serializable, StructLayout(LayoutKind.Sequential)]
    public struct Enumerator : IEnumerator<T>, IDisposable, IEnumerator
    {
        private Stack<T> _stack;
        private int _index;
        private int _version;
        private T currentElement;
        internal Enumerator(Stack<T> stack)
        {
            this._stack = stack;
            this._version = this._stack._version;
            this._index = -2;
            this.currentElement = default(T);
        }
 
        public void Dispose()
        {
            this._index = -1;
        }
 
        public bool MoveNext()
        {
            bool flag;
            if (this._version != this._stack._version)
            {
                ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
            }
            if (this._index == -2)
            {
                this._index = this._stack._size - 1;
                flag = this._index >= 0;
                if (flag)
                {
                    this.currentElement = this._stack._array[this._index];
                }
                return flag;
            }
            if (this._index == -1)
            {
                return false;
            }
            flag = --this._index >= 0;
            if (flag)
            {
                this.currentElement = this._stack._array[this._index];
                return flag;
            }
            this.currentElement = default(T);
            return flag;
        }
 
        public T Current
        {
            get
            {
                if (this._index == -2)
                {
                    ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumNotStarted);
                }
                if (this._index == -1)
                {
                    ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumEnded);
                }
                return this.currentElement;
            }
        }
        object IEnumerator.Current
        {
            get
            {
                if (this._index == -2)
                {
                    ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumNotStarted);
                }
                if (this._index == -1)
                {
                    ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumEnded);
                }
                return this.currentElement;
            }
        }
        void IEnumerator.Reset()
        {
            if (this._version != this._stack._version)
            {
                ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
            }
            this._index = -2;
            this.currentElement = default(T);
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.4 из 5
Похожие ответы