Очередь+Массив

Страницы: 1
RSS
Очередь+Массив, Объединение свойств очереди и массива.
 
Добрый день
В прошлой версии форума я задавал вопрос про массивы и очереди,
так вот - разобрался!!! Выкладываю код, может кому понадобится
*********************************
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) -> Доступ к элементу


Если ГУРУ заметят ошибки в коде - прошу высказать!!!
 
Добрый день,
А такой вариант устроит ?

----    создать новый массив, максимальная длина N
new=function(N) local t={}; t.len=N; return t; end  

----     вытолкнуть первый элемент
pop=function(t) if #t>0 then return table.remove(t,1); end end  

----     поставить в очередь , если очередь >N -вытолкнуть первый
push=function(t,x) t[#t+1]=x; if #t>t.len then return table.remove(t,1) end; end


--------------- доступ к любому элементу как к элементу таблицы квадратными скобками
 
Добрый вечер,
Я в луа не силен, поэтому додумываю существующие варианты. Нашел очередь, ее и додумывал  :) . В очереди - при добавлении нового элемента - предыдущие элементы сдвигаются на шаг. Будет ли реализовываться это в вашем варианте - не знаю в силу недостаточности знаний луа.
За пример кода - спасибо!
 
Цитата
Николай Камынин пишет:
Добрый день,
А такой вариант устроит ?
Этот вариант будет работать только внутри одного потока исполнения.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Добрый день,Владимир,
1) Из своего опыта замечу,
что самый эффективный алгоритм и его реализацию подобного класса задач
можно сделать с использованием
операций над битами и языка уровня СИ.
 
Владимир,
Я вот немного ваши программы переписал в таком виде:
--------------------------------------------
local function _new(q_size)
return { first = 1, last =0, max_size = q_size }
end

local function _delq(q)
local m=q.first
local x = q[m]
q[m] = nil
q.first = m + 1
return x
end

local function _push( q, value )
q.last = q.last + 1
q[q.last] = value
if q.last >q.max_size then return _delq(q) end
end

local function _pop( q)
if q.last>=q.first then return _delq(q); end
end

local function _get(q,pos)
local x=q.first+pos
if q.last>=x then  return q[x] end
end
-- если очередь пустая  то get(q,0)=nil
 
Добрый день,
Нарисовал библиотеку на чистом луа для работы с очередями без использования каких либо модулей.
Полагаю должна работать с QLUA без проблем.
------------------------------
Отличается от написанной выше Владимиром следующим:
1) Вариант Владимира может работать лишь при условии что длина истории очереди не выходит за точность чисел в формате double.
2) В моем варианте функция push работает в 3 раза быстрее
3) добавил функцию full - для обнаружения заполненной очереди.
--------------------------------------
Особо сильно не тестировал, поэтому сообщения об ошибках приветствуются.
--------------------------------
модуль можно взять тут http://www.kamynin.ru
Страницы: 1
Читают тему
Наверх