{"id":25732226,"url":"https://github.com/howprogrammingworks/dequeue","last_synced_at":"2025-06-22T06:04:27.325Z","repository":{"id":54568219,"uuid":"121082916","full_name":"HowProgrammingWorks/Dequeue","owner":"HowProgrammingWorks","description":"Stack, Queue and Dequeue","archived":false,"fork":false,"pushed_at":"2023-12-02T20:42:41.000Z","size":16,"stargazers_count":4,"open_issues_count":0,"forks_count":12,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-06-22T06:04:17.092Z","etag":null,"topics":["data","data-structures","deque","dequeue","js","jsvascript","stack"],"latest_commit_sha":null,"homepage":"https://www.youtube.com/TimurShemsedinov","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HowProgrammingWorks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-02-11T04:05:48.000Z","updated_at":"2022-09-08T19:48:21.000Z","dependencies_parsed_at":"2025-05-07T18:44:16.614Z","dependency_job_id":null,"html_url":"https://github.com/HowProgrammingWorks/Dequeue","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/HowProgrammingWorks/Dequeue","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HowProgrammingWorks%2FDequeue","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HowProgrammingWorks%2FDequeue/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HowProgrammingWorks%2FDequeue/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HowProgrammingWorks%2FDequeue/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HowProgrammingWorks","download_url":"https://codeload.github.com/HowProgrammingWorks/Dequeue/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HowProgrammingWorks%2FDequeue/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261244008,"owners_count":23129639,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data","data-structures","deque","dequeue","js","jsvascript","stack"],"created_at":"2025-02-26T03:40:00.865Z","updated_at":"2025-06-22T06:04:21.547Z","avatar_url":"https://github.com/HowProgrammingWorks.png","language":"JavaScript","readme":"# Stack, Queue and Dequeue\n\n[![Структуры данных: списки, стек, очередь, дэк](https://img.youtube.com/vi/9KvA4hDDSjk/0.jpg)](https://www.youtube.com/watch?v=9KvA4hDDSjk)\n\nЗадания (на выбор):\n- Реализовать стек, очередь и дэк на прототипах и замыканиях\n- Реализовать стек через 2 класса (Stack + Element), то же и с очередью и дэком\n- Добавить протокол iterable\n  - см. про `next()` и [`Symbol.iterator`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols)\n- Сделать методы и свойства:\n  - Клонирование `.clone():list`\n  - Очистка `.clear()`\n  - Кол-во элементов `.size`\n- Реализовать события (чтоб можно было на них подписываться, но чтоб cнаружи\nнельзя было делать`emit`):\n  - `.on('push', (element, dequeue) =\u003e {})`\n  - `.on('pop', (element, dequeue) =\u003e {})`\n  - `.on('unshift', (element, dequeue) =\u003e {})`\n  - `.on('shift', (element, dequeue) =\u003e {})`\n  - Когда дэк опустошен `.on('drain', (dequeue) =\u003e {})`\n- Взять односвязный или двусвязный список и унаследовать от него\nстек, очередь и дэк\n- Взять односвязный или двусвязный список и на базе их построить\nстек, очередь и дэк через механизм агрегированяи (делегирования)\n- Добавить в очерез таймаут ожидания в очереди `queue.timeout(msec)`\n- Добавить в очередь работу с приоритетами (упорядочить очередь по приоритету)\n- Реализовать очередь с приоритетами на базе массива и дерева\n- Асинхронные аналоги\n  - `.pop((data) =\u003e {})`\n  - `.shift((data) =\u003e {})`\n  - аналоги на Promise\n\nПостроение цепочек из очередей:\n```js\nconst incoming = new Queue();\nconst calculating = new Queue();\nconst preparing = new Queue();\n\nincoming.process(item =\u003e item).pipe(calculating);\ncalculating.process(item =\u003e item).pipe(preparing);\npreparing.process(item =\u003e {\n  console.log(item);\n});\n```\n\nРеализация стека со сбором статичтики на замыканиях\n```\nconst q = queue();\n\n// Используем при помощи методов\nq.put(obj1);\nq.pick((obj2) =\u003e { });\n\n// Выводим статистику использования\nconsole.dir(q);\n\n/* {\n  elapsedTime: 12783, // время существования стека\n  processed: 1773, // кол-во было обработано всего\n  processing: 29, // кол-во обрабатывается сейчас\n  minTime: 6, // минимальное время элемента в стеке\n  maxTime: 1720, // максимальное время элемента в стеке\n  averageTime: 803, // среднее время с стеке\n} */\n```\n\nРеализация конкурентной очереди с приоритетами и трехканальной обработкой\nс таймаутами на замыканиях (реализация СМО, системы массового обслуживания)\n```\nconst q = queue(3).timeout(2000);\n\nq.process((item, callback) =\u003e {\n  process.nextTick(() =\u003e {\n    console.log(item);\n    callback();\n  });\n});\n\nq.drain(() =\u003e {\n  console.log('Queue drain');\n});\n\nfor (let i = 0; i \u003c 10; i++) {\n  q.add({ i }, i % 2); // второй параметр - приоритет\n}\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhowprogrammingworks%2Fdequeue","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhowprogrammingworks%2Fdequeue","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhowprogrammingworks%2Fdequeue/lists"}