Как реализовать стек на C#?

Используя только using System;
  • Вопрос задан
  • 1344 просмотра
Решения вопроса 1
@Namynnuz
Например, вот так:
public class SimpleSystemStack<T> where T : struct, IConvertible {
    private readonly int _sizeOfOneElement;
    private T[] _array;

    public SimpleSystemStack( int sizeOfOneElement, T[] inputArray = null ) {
        _sizeOfOneElement = sizeOfOneElement;
        if ( inputArray?.Length > 0 ) {
            Length = inputArray.Length;
            _array = inputArray;
        } else {
            Length = 0;
            _array = new T[sizeOfOneElement];
        }
    }

    public int Length { get; private set; }

    public T Pop() {
        if ( Length > 0 ) {
            Length--;
            return _array[Length];
        }
        throw new IndexOutOfRangeException("Stack is Empty.");
    }

    public void Push( T element ) {
        if ( Length >= int.MaxValue )
            throw new IndexOutOfRangeException("Stack overflow.");
        if ( Length >= _array.Length ) {
            var temp = new T[_array.Length * 2];
            Buffer.BlockCopy( _array, 0, temp, 0, Length * _sizeOfOneElement );
            _array = temp;
        }
        _array[Length] = element;
        Length++;        
    }
}

Использование:
var sss = new SimpleSystemStack<int>( sizeof( int ) );

sss.Push( 1 );
sss.Push( 2 );
sss.Push( 3 );
sss.Pop();
sss.Pop();
sss.Push( 4 );

Работает только для primitive types.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
а что? гугл уже тоже заблокировали? стек на C#

ps вспомнил, был тут вопрос об оптимизации стека, где то в январе 2017, чел там на классах все расписал, но в приоритете была именно скорость )).. но еще и было требование функций модифкации стека.. оказалось у меня сохранился проект. вот код (System.Diagnostics необходим для замеров времени исполнения)

using System;
using System.Diagnostics;

namespace stack
{
    public class Program
    {
        static private int max = 100_000_000;

        class Stack
        {
            private int[] sd = new int[max];
            private int sp = -1;

            public void Push(int data)        => sd[++sp] = data; 
            public int  Pop()                 => sd[sp--];

            public void Rep(int sp, int data) => sd[sp] = data; 
            public void Inc(int sp, int data) => sd[sp] += data; 
            public void Dec(int sp, int data) => sd[sp] -= data; 
            public void Xor(int sp, int data) => sd[sp] %= data; 
        }

        public static void StackTest()
        {
            var watch = new Stopwatch();
            var stack = new Stack();

            var count = max;

            watch.Start();
            for (int i = 0; i < count; i++)
                stack.Push(i);
            watch.Stop();
            Console.WriteLine(watch.Elapsed);

            watch.Restart();
            for (int i = 0; i < count; i++)
                stack.Xor(i, 2);
            watch.Stop();
            Console.WriteLine(watch.Elapsed);

            watch.Restart();
            for (int i = 0; i < count; i++)
                stack.Pop();
            watch.Stop();
            Console.WriteLine(watch.Elapsed);

            Console.ReadKey();
        }

        public static void Main() => StackTest();
    }
}


! данный прототип действительно не содержит ни каких обработчиков возможного переполнения ;))
ну и кусок кода https://i.imgur.com/AejLUcX.png для классического стека, скорее всего совсем не нужен ))

всяческие bool empty() ... это bool empty() => sp < 0; .. ну в смысле для данного прототипа ))
Ответ написан
Комментировать
@lvv85
Реализация стека в .NET Framework link
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы