adt_stack.inc
Создает стек структуры (последним пришел, первым ушел). Есть только два типа действия: добавление элемента (Push) и его удаление (Pop). Удалить можно только последний элемент, т.е. удаление происходит только с конца.
Handle:CreateStack(blocksize=1);
Код
Создаёт пустую стек структуру.
blocksize - количество ячеек для каждого элемента list[][X].
Если вы хотите хранить в стеке строки или массивы, то размер нужно сделать побольше.
PushStackCell(Handle:stack, any:value);
Код
Помещает значение (int, float, Handle, byte) в конец стека (добавляется новый индекс). Это может безопасно использоваться, даже если стек имеет размер блока больше 1.
PushStackString(Handle:stack, const String:value[]); - добавляет строку в конец стека
PushStackArray(Handle:stack, const any:values[], size=-1); - массив
bool:PopStackCell(Handle:stack, &any:value, block=0, bool:asChar=false);
Код
Последний элемент стека удаляется, а его значение записывается в any:value (вашу переменную).
При этом размер стека уменьшается (-1 индекс).
bool:PopStackString(Handle:stack, String:buffer[], maxlength, &written=0); - извлечь строку
bool:PopStackArray(Handle:stack, any:buffer[], size=-1); - массив
bool:IsStackEmpty(Handle:stack); - вернет true, если стек пуст (нет элементов)
PopStack(Handle:stack) - это просто удаляет элемент с конца стека, не возвращая его значение
Код для теста:
Код
public OnPluginStart()
{
new Handle:st = CreateStack(1);
PrintToServer("Stack empty: %d", IsStackEmpty(st));
PushStackCell(st, 1);
PushStackCell(st, 3);
PushStackCell(st, 5);
PrintToServer("Stack empty: %d", IsStackEmpty(st));
decl value;
while (PopStackCell(st, value))
{
PrintToServer("value: %d", value);
}
PrintToServer("Stack empty: %d", IsStackEmpty(st));
}
Результат:
Код
Stack empty: 1
Stack empty: 0
value: 5
value: 3
value: 1
Stack empty: 1
Если бы добавили PopStack(st); перед decl value; (выше), то показало бы это:
Код
value: 3
value: 1
// 5 - было удалено