TypeScript में कार्य कतारों का परिचय
\n\nकार्य कतार (Queue) प्रोग्रामिंग में मूलभूत डेटा संरचनाओं में से एक है, जो FIFO (First In, First Out — "पहले आया, पहले गया") सिद्धांत पर काम करती है। एक सामान्य दुकान की कतार की कल्पना करें: पहला ग्राहक जो कतार में खड़ा होता है, पहले सेवा प्राप्त करता है। प्रोग्रामिंग में, कार्य कतार का उपयोग सर्वर पर अनुरोधों को संसाधित करने से लेकर ब्राउज़र में एसिंक्रोनस संचालन प्रबंधित करने तक, हर जगह किया जाता है।
\n\nइस लेख में, हम TypeScript में कार्य कतार बनाने और उपयोग करने का तरीका समझेंगे। आप सीखेंगे कि कतार को टाइप कैसे करें, बुनियादी विधियों को कैसे लागू करें और इसे वास्तविक परियोजनाओं में कैसे उपयोग करें। यह सामग्री उन शुरुआती डेवलपर्स के लिए है जो TypeScript की मूल बातों से परिचित हैं।
\n\nकतार के साथ बुनियादी संचालन
\n\nकिसी भी कार्य कतार को कई बुनियादी संचालनों का समर्थन करना चाहिए:
\n\n- \n
- enqueue (कतार के अंत में एक तत्व जोड़ना); \n
- dequeue (कतार की शुरुआत से एक तत्व निकालना); \n
- peek (हटाए बिना पहला तत्व देखना); \n
- isEmpty (जांचना कि कतार खाली है या नहीं); \n
- size (तत्वों की संख्या जानना)। \n
TypeScript में, हम कतार को ऐरे या लिंक्ड लिस्ट के आधार पर लागू कर सकते हैं। सरलता के लिए, हम ऐरे से शुरू करते हैं।
\n\nऐरे-आधारित कतार कार्यान्वयन
\n\nजेनेरिक्स का उपयोग करके एक Queue क्लास बनाएं — यह किसी भी प्रकार के डेटा को संग्रहीत करने की अनुमति देगा:
class Queue<T> {\n private items: T[] = [];\n\n // कतार के अंत में तत्व जोड़ें\n enqueue(element: T): void {\n this.items.push(element);\n }\n\n // पहला तत्व हटाएं और लौटाएं\n dequeue(): T | undefined {\n return this.items.shift();\n }\n\n // हटाए बिना पहला तत्व देखें\n peek(): T | undefined {\n return this.items[0];\n }\n\n // जांचें कि कतार खाली है या नहीं\n isEmpty(): boolean {\n return this.items.length === 0;\n }\n\n // कतार का आकार प्राप्त करें\n size(): number {\n return this.items.length;\n }\n}\n\nअब किसी भी डेटा प्रकार के लिए एक कतार बनाई जा सकती है:
\n\n// स्ट्रिंग्स की कतार\nconst stringQueue = new Queue<string>();\nstringQueue.enqueue('कार्य 1');\nstringQueue.enqueue('कार्य 2');\nconsole.log(stringQueue.dequeue()); // 'कार्य 1'\n\n// संख्याओं की कतार\nconst numberQueue = new Queue<number>();\nnumberQueue.enqueue(10);\nnumberQueue.enqueue(20);\nconsole.log(numberQueue.peek()); // 10\n\nऐरे कार्यान्वयन की कमियां
\n\nJavaScript/TypeScript में shift() विधि की जटिलता O(n) है, क्योंकि पहले तत्व को हटाने के बाद बाकी सभी तत्व स्थानांतरित हो जाते हैं। बड़े डेटा वॉल्यूम के लिए यह अक्षम है। समाधान — कतार को ऑब्जेक्ट या लिंक्ड लिस्ट के आधार पर लागू करना।
ऑब्जेक्ट के साथ अनुकूलित कतार
\n\nतत्वों के स्थानांतरण से बचने के लिए, हम तत्वों को एक ऑब्जेक्ट में संग्रहीत करेंगे और शुरुआत और अंत के इंडेक्स को ट्रैक करेंगे:
\n\nclass OptimizedQueue<T> {\n private items: Record<number, T> = {};\n private head: number = 0;\n private tail: number = 0;\n\n enqueue(element: T): void {\n this.items[this.tail] = element;\n this.tail++;\n }\n\n dequeue(): T | undefined {\n if (this.isEmpty()) {\n return undefined;\n }\n const item = this.items[this.head];\n delete this.items[this.head];\n this.head++;\n return item;\n }\n\n peek(): T | undefined {\n return this.items[this.head];\n }\n\n isEmpty(): boolean {\n return this.tail === this.head;\n }\n\n size(): number {\n return this.tail - this.head;\n }\n}\n\nअब enqueue और dequeue संचालन O(1) — स्थिर समय में निष्पादित होते हैं, भले ही