Стек на основе массива с использованием 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 () может просто удвоить текущую емкость, выделить новый массив с настроенным размером и скопировать все данные из старого массива в новый.