Понадобилось тут для одной из частей проекта, написанной на языке Lua, реализовать простейший стек. Решил оставить в заметках, вдруг кому-то понадобится. Вот, что получилось:
simple_stack =
{
content = {},
}
function simple_stack:push( item )
table.insert( self.content, item )
end
function simple_stack:pop()
local res = simple_stack:top()
table.remove( self.content )
return res
end
function simple_stack:top()
local n = #self.content
if n > 0 then
return self.content[n]
end
return nil
end
function simple_stack:new()
local res = {}
setmetatable( res, { __index = self } )
return res
end
Стек имеет методы:
- push - помещение элемента в стек;
- pop - удаление верхнего элемента из стека, удаляемый элемент возвращается;
- top - доступ к верхнему элементу стека;
- new - конструктор.
В такой стек можно помещать элементы любого типа, однако контроль за типом элементов помещаемых в стек и извлекаемых из него целиком возлагается на программиста.
Пример использования:
my_stack = simple_stack:new()
my_stack:push( 1 )
my_stack:push( 2 )
my_stack:push( 3 )
print( 'Top stack element:', my_stack:top() )
print(
'Stack content:',
my_stack:pop(),
my_stack:pop(),
my_stack:pop()
)
Результатом выполнения будет:
Top stack element: 3
Stack content: 3 2 1
Недостатком данной реализации стека является невозможность создать более одного экземпляра стека, поскольку все созданные экземпляры будут использовать единую таблицу content для сохранения элементов.