Добрый день
В прошлой версии форума я задавал вопрос про массивы и очереди,
так вот - разобрался!!! Выкладываю код, может кому понадобится
*********************************
Queue = {}
function Queue.new(q_size)
return { first = 0, last = -1, max_size = q_size }
end
function Queue.push( queue, value )
queue.last = queue.last + 1
queue[queue.last] = value
if queue.last >= queue.max_size then
local val = queue[queue.first]
queue[queue.first] = nil
queue.first = queue.first + 1
end
end
function Queue.pop( queue )
if queue.first > queue.last then
return nil
end
local val = queue[queue.first]
queue[queue.first] = nil
queue.first = queue.first + 1
return val
end
function Queue.empty( queue )
return queue.first > queue.last
end
function Queue.get( queue, pos)
if queue.first > queue.last then
return nil
end
if pos > queue.last then
return nil
end
local val = queue[queue.first + pos]
return val
end
*********************************
Использование:
q = Queue.new(5) -> Создаем очередь фиксированной длины, в данном случае - 5 элементов. По мере добавления новых элементов, лишние(свыше 5) удаляются
qq = Queue.new() -> Создаем очередь бесконечной длины
v1 = Queue.get(q,0) -> Доступ к элементу
v2 = Queue.get(q,1) -> Доступ к элементу
v3 = Queue.get(q,2) -> Доступ к элементу
v4 = Queue.get(q,3) -> Доступ к элементу
v5 = Queue.get(q,4) -> Доступ к элементу
v6 = Queue.get(q,5) -> Доступ к элементу
Если ГУРУ заметят ошибки в коде - прошу высказать!!!
В прошлой версии форума я задавал вопрос про массивы и очереди,
так вот - разобрался!!! Выкладываю код, может кому понадобится
*********************************
Queue = {}
function Queue.new(q_size)
return { first = 0, last = -1, max_size = q_size }
end
function Queue.push( queue, value )
queue.last = queue.last + 1
queue[queue.last] = value
if queue.last >= queue.max_size then
local val = queue[queue.first]
queue[queue.first] = nil
queue.first = queue.first + 1
end
end
function Queue.pop( queue )
if queue.first > queue.last then
return nil
end
local val = queue[queue.first]
queue[queue.first] = nil
queue.first = queue.first + 1
return val
end
function Queue.empty( queue )
return queue.first > queue.last
end
function Queue.get( queue, pos)
if queue.first > queue.last then
return nil
end
if pos > queue.last then
return nil
end
local val = queue[queue.first + pos]
return val
end
*********************************
Использование:
q = Queue.new(5) -> Создаем очередь фиксированной длины, в данном случае - 5 элементов. По мере добавления новых элементов, лишние(свыше 5) удаляются
qq = Queue.new() -> Создаем очередь бесконечной длины
v1 = Queue.get(q,0) -> Доступ к элементу
v2 = Queue.get(q,1) -> Доступ к элементу
v3 = Queue.get(q,2) -> Доступ к элементу
v4 = Queue.get(q,3) -> Доступ к элементу
v5 = Queue.get(q,4) -> Доступ к элементу
v6 = Queue.get(q,5) -> Доступ к элементу
Если ГУРУ заметят ошибки в коде - прошу высказать!!!