Стек на основе массива с использованием C#

Я уже реализовал метод для реализации Push, Pop, Peek в стеке на основе массива. Но я застрял в методе возврата размера стека и реализации динамического изменения размера, так как я не понимаю, что такое "динамическое изменение размера". Пожалуйста помоги!

2 ответа

Решение

Во-первых, я хотел бы упомянуть некоторые вещи, которые не соответствуют вашей программе.
Вы действительно хотите сделать массив общедоступным? Вы не хотите, чтобы вызывающие абоненты изменяли массив напрямую.
В конструкторе вы должны убедиться, что емкость не является отрицательным числом.
Некоторые из ваших свойств могут быть просто полями.
Емкость - это просто длина массива, она должна быть доступна только для чтения.

private int[] data;
private int top;

private int Capacity { get { return data.Length; } }

Метод Push не имеет смысла. Если массив заполнен, вы просто отменяете операцию push. Вот когда вам нужно увеличить массив.

public void Push(int value) {
    if (IsFull()) GrowArray();
    ++top;
    this.data[top] = value;
}

private void GrowArray() {
    //determine what the new length should be
    int newLength = Capacity == 0 ? 4 : Capacity * 2;
    int[] newArray = new int[newLength];
    //copy all the items to the new array.
    for (int i = 0; i <= top ++i)
        newArray[i] = data[i];
    //instead of the for-loop you can write:
    //Array.Copy(data, newArray, Capacity);
    data = newArray; //replace the old array with the new
}

Динамическое изменение размера означает, что вы увеличиваете стек, как только он заполнится.

growArray () может просто удвоить текущую емкость, выделить новый массив с настроенным размером и скопировать все данные из старого массива в новый.

Другие вопросы по тегам