@dimx14

Реализация стека в виде массива c#, из-за чего ошибка?

Выдаёт ошибку:"Использование универсального тип "ConsoleApplication1.CStack" требует аргумент типа "1" ".
namespace ConsoleApplication1
{
public class CStack
{
private T[] _array; //массив для хранения данных типа T
private const int defaultCapacity = 10; //вместимость по умолчанию, потом можно расширить
private int size; //размер

public CStack()
{ //конструктор
this.size = 0;
this._array = new T[defaultCapacity];
}

public bool isEmpty() //проверка на пустоту
{
return this.size == 0;
}

public virtual int Count //параметр для вывода размера
{
get
{
return this.size;
}
}

public T Pop() //метод взятия с вершины
{
if (this.size == 0)
{ //вброс ошибки при взятии с пустого стека (Overflow)
throw new InvalidOperationException();
}
return this._array[--this.size];
}

public void Push(T newElement)
{
if (this.size == this._array.Length) //если у нас переполнение...
{ //знаю, что неоптимально, но это c#...
T[] newArray = new T[2 * this._array.Length];
Array.Copy(this._array, 0, newArray, 0, this.size);
this._array = newArray; //просто создаем новый массив с двойным размером
}
this._array[this.size++] = newElement; //вставляем элемент
}

public T Peek()
{
if (this.size == 0)
{
throw new InvalidOperationException();
}
return this._array[this.size - 1];
}
}
class Program
{
static void Main(string[] args)
{
CStack stack = new CStack();
stack.Push(3);
stack.Push(18);
Console.WriteLine("element Number " + stack.Count.ToString() + " is " + stack.Pop().ToString());
Console.WriteLine("element Number " + stack.Count.ToString() + " is " + stack.Pop().ToString());
Console.ReadLine();
}
}
}
  • Вопрос задан
  • 563 просмотра
Решения вопроса 1
@dmitryKovalskiy
программист средней руки
Простите, а где у вас собственно создается T. Это генерик? Тогда ваш класс должен быть CStack<T>

По коду :
Метод POP - а где у вас удаляется элемент из списка? Или он продолжит там лежать? А если тип будет тяжеловесным?
Откуда у вас такая любовь к this?
Я бы еще заменил исключение на собственное - "Стек пуст". Вы бросаете InvalidOperationException без пояснений. Как я как клиент должен догадаться что произошло?

P.S. Стек это НЕ массив. Стек это связанный список с правилом обхода LIFO. Каждый объект должен иметь ссылку на следующий объект стека.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы