У абстрактного класса может быть несколько потомков, задающих его реализацию в зависимости от выбора представления данных. Так, стек можно построить не только на списковом представлении, но и на основе массива. Иногда такая реализация более эффективна. Я оставляю построение этой реализации читателю. Отмечу лишь те моменты, на которые стоит обратить внимание.
Массивы, в отличие от списка, имеют фиксированный размер. Конечно, размер массива можно передавать конструктору класса, позволяя строить стеки заданной емкости. Но в этом случае на емкость стека накладывается ограничение. Можно, конечно, использовать не массив C#, а встроенную динамическую структуру ArrayList, которая была задействована для представления списка. Но это не честно с методической точки зрения, поскольку в библиотеке FCL есть и класс Stack, собственную реализацию которого хочется построить. Еще одно возможное решение, которое предлагается реализовать, может быть основано на следующем подходе. Вначале строится массив фиксированного размера, что и определяет текущую емкость стека. Если в процессе работы со стеком обнаруживается, что нужно добавить в стек элемент, а памяти уже нет, то динамически увеличивается размер массива.