
Computer میں data کو صرف رکھنا کافی نہیں ہوتا — اسے ایسے انداز میں رکھنا پڑتا ہے کہ ضرورت پڑھنے پر وہ فوراً مل بھی جائے اور اس میں تبدیلی بھی آسانی سے ہو سکے. Data کو ترتیب دینے کے اسی طریقے کو computational structure (ya data structure) کہتے ہیں. سوچو, کتابوں کو اگر almari میں بے-ترتیب phenk دیا جائے تو ایک کتاب ڈھونڈنا مشکل ہو جائے گا; لیکن اگر وہ subject کے حساب سے لگی ہوں تو کام آساں ہو جاتا ہے. بالکل اسی طرح program میں data کی ترتیب ہی اس کی رفتار اور آسانی طے کرتی ہے.
اس chapter میں ہم پانچ بنیادی structures پڑھیں گے: lists, stacks, queues, trees aur graphs. ان میں سے سب سے پہلا اور سب سے زیادہ استعمال ہونے والا structure list ہے. List ایک ایسی ترتیب ہے جس میں کئی چیزیں ایک خاص sequence میں رکھی جاتی ہیں. List کی ہر چیز کو element کہتے ہیں, اور ہر element کی ایک index (position) ہوتی ہے جس سے اسے سیدھا پکڑا جا سکتا ہے.
Python میں list بنانے کے لیے square brackets [ ] استعمال ہوتے ہیں اور items کو comma سے الگ کیا جاتا ہے. کتاب کی مثال دیکھو:
# Create a list of items
items = ["Decorations", "Snacks", "Cold drinks", "Plates", "Balloon"]
# Print the list
print(items)['Decorations', 'Snacks', 'Cold drinks', 'Plates', 'Balloon']Yahan items list کا نام ہے. Text والی چیزیں quotes میں لکھی گئی ہیں اور ہر item comma سے جدا ہے. print(items) پوری list ایک ہی line میں دکھا دیتا ہے. یاد رکھو, Python میں counting 0 سے شروع ہوتی ہے — اس لیے "Decorations" index 0 پر ہے, "Snacks" index 1 پر, اور آخری item "Balloon" index 4 پر.
کمپیوٹر میں ڈیٹا کو صرف رکھنا کافی نہیں ہوتا — اسے ایسے انداز میں رکھنا پڑتا ہے کہ ضرورت پڑنے پر وہ فوراً مل بھی جائے اور اس میں تبدیلی بھی آسانی سے ہو سکے۔ ڈیٹا کو ترتیب دینے کے اسی طریقے کو کمپیوٹیشنل سٹرکچر (یا ڈیٹا سٹرکچر) کہتے ہیں۔ سوچو، کتابوں کو اگر الماری میں بے ترتیب پھینک دیا جائے تو ایک کتاب ڈھونڈنا مشکل ہو جائے گا؛ لیکن اگر وہ مضمون کے حساب سے لگی ہوں تو کام آسان ہو جاتا ہے۔ بالکل اسی طرح پروگرام میں ڈیٹا کی ترتیب ہی اس کی رفتار اور آسانی طے کرتی ہے۔
اس باب میں ہم پانچ بنیادی سٹرکچرز پڑھیں گے: لسٹس، اسٹیکس، کیوز، ٹریز اور گرافس۔ ان میں سے سب سے پہلا اور سب سے زیادہ استعمال ہونے والا سٹرکچر لسٹ ہے۔ لسٹ ایک ایسی ترتیب ہے جس میں کئی چیزیں ایک خاص سیکوئنس میں رکھی جاتی ہیں۔ لسٹ کی ہر چیز کو ایلیمنٹ کہتے ہیں، اور ہر ایلیمنٹ کی ایک انڈیکس (پوزیشن) ہوتی ہے جس سے اسے سیدھا پکڑا جا سکتا ہے۔
پائتھن میں لسٹ بنانے کے لیے مربع بریکٹس [ ] استعمال ہوتے ہیں اور آئٹمز کو کوما سے الگ کیا جاتا ہے۔ کتاب کی مثال دیکھو: items = ["Decorations", "Snacks", "Cold drinks", "Plates", "Balloon"] — یہاں items لسٹ کا نام ہے، ٹیکسٹ والی چیزیں کوٹس میں لکھی گئی ہیں۔ print(items) پوری لسٹ ایک ہی لائن میں دکھا دیتا ہے۔ یاد رکھو، پائتھن میں گنتی 0 سے شروع ہوتی ہے — اس لیے "Decorations" انڈیکس 0 پر ہے اور آخری آئٹم "Balloon" انڈیکس 4 پر۔
List کی تین خاص properties ہیں, اور انہی کی وجہ سے وہ اتنی مفید ہے. پہلی: Dynamic Size — Python کی list کا size fixed نہیں ہوتا. تم بعد میں نئے items add کر سکتے ہو یا پرانے hata سکتے ہو, اور list خود-ba-خود اپنے size کو adjust کر لیتی ہے. کسی نئی list بنانے کی ضرورت نہیں پڑتی; وہی list بڑھتی یا گھٹتی رہتی ہے.
Doosri: Index-Based Access — ہر item کی ایک fixed position ہوتی ہے. پہلا item index 0, دوسرا index 1, تیسرا index 2, اور اسی طرح آگے. اس کا مطلب ہے کہ تم پوری list کو chaanay کے بجائے سیدھا items[2] لکھ کر "Cold drinks" تک pahonch سکتے ہو. یہ سیدھی رسائی (direct access) list کی سب سے بڑی طاقت ہے.
Teesri: Ordered Collection — جس ترتیب سے تم items add کرتے ہو, وہی ترتیب محفوظ رہتی ہے. اگر "Buy drinks" پہلے لکھا گیا تو وہ پہلے ہی رہیگا, جب تک تم خود اسے move نہ کرو. اس لیے list ان کاموں کے لیے بہترین ہے جہاں ترتیب matter کرتی ہے — جیسے تو-دو list, shopping list یا students کی attendance.
لسٹ کی تین خاص خصوصیات ہیں، اور انہی کی وجہ سے وہ اتنی مفید ہے۔ پہلی: ڈائنامک سائز — پائتھن کی لسٹ کا سائز فکسڈ نہیں ہوتا۔ تم بعد میں نئے آئٹمز شامل کر سکتے ہو یا پرانے ہٹا سکتے ہو، اور لسٹ خود بخود اپنے سائز کو ایڈجسٹ کر لیتی ہے۔ کسی نئی لسٹ بنانے کی ضرورت نہیں پڑتی؛ وہی لسٹ بڑھتی یا گھٹتی رہتی ہے۔
دوسری: انڈیکس بیسڈ ایکسیس — ہر آئٹم کی ایک فکسڈ پوزیشن ہوتی ہے۔ پہلا آئٹم انڈیکس 0، دوسرا انڈیکس 1، تیسرا انڈیکس 2، اور اسی طرح آگے۔ اس کا مطلب ہے کہ تم پوری لسٹ کو چھانے کے بجائے سیدھا items[2] لکھ کر "Cold drinks" تک پہنچ سکتے ہو۔ یہ سیدھی رسائی لسٹ کی سب سے بڑی طاقت ہے۔
تیسری: آرڈرڈ کلیکشن — جس ترتیب سے تم آئٹمز شامل کرتے ہو، وہی ترتیب محفوظ رہتی ہے۔ اگر "Buy drinks" پہلے لکھا گیا تو وہ پہلے ہی رہے گا، جب تک تم خود اسے موو نہ کرو۔ اس لیے لسٹ ان کاموں کے لیے بہترین ہے جہاں ترتیب اہم ہوتی ہے — جیسے ٹو ڈو لسٹ، شاپنگ لسٹ یا طلبہ کی حاضری۔
1. Insertion — insert() se kisi bhi jagah item dalna. کتاب کی party-list مثال کو step by step دیکھو:
party_list = ["Buy drinks", "Buy decorations", "Buy snacks", "Buy cold drinks"]
party_list.insert(0, "Invite friends") # add Invite friends at start
print(party_list)['Invite friends', 'Buy drinks', 'Buy decorations', 'Buy snacks', 'Buy cold drinks']insert(0, ...) کا پہلا number بتاتا ہے kahan ڈالنا ہے اور دوسرا kya ڈالنا ہے. Index 0 کا مطلب سب سے شروع, اس لیے "Invite friends" سب سے پہلے آ گیا اور باقی سب items ایک-ایک position آگے کھسک گئے. ⚠️ کتاب میں note کرو: printed page 57 پر اس code کا output غلط چھپا ہے — اس میں "Invite friends" نظر نہیں آتا اور پرانی list ہی دکھائی گئی ہے. صحیح output وہی ہے جو اوپر دیا گیا ہے, کیوں کے insert() کا کام ہی item کو شامل کرنا ہے.
2. Deletion — do tareeqay. (a) Value se — remove(): party_list.remove("Buy snacks") پہلی دفعہ ملنے والا "Buy snacks" hata دیتا ہے, چاہے وہ کسی بھی index پر ہو. (b) Index se — pop(): party_list.pop(0) index 0 والا item hata دیتا ہے. کتاب کی مثال میں list ["Invite friends", "Buy decorations", "Buy cold drinks"] thi; pop(0) ne "Invite friends" hataya to baaqi reh gaya ['Buy decorations', 'Buy cold drinks'].
3. Searching — ان keyword سے check کرنا. if "Buy cold drinks" in party_list: صرف یہ پوچھتا ہے کہ item list میں ہے یا نہیں — True یا False. کتاب کے code میں یہ item موجود تھا, اس لیے output آیا: "Buy cold drinks is on the list." یہ search پوری list میں item ڈھونڈتا ہے, index یاد رکھنے کی ضرورت نہیں.
۱۔ انسرشن — insert() سے کسی بھی جگہ آئٹم ڈالنا۔ کتاب کی پارٹی لسٹ مثال کو قدم بہ قدم دیکھو: party_list.insert(0, "Invite friends") میں پہلا نمبر بتاتا ہے کہاں ڈالنا ہے اور دوسرا کیا ڈالنا ہے۔ انڈیکس 0 کا مطلب سب سے شروع، اس لیے "Invite friends" سب سے پہلے آ گیا اور باقی سب آئٹمز ایک ایک پوزیشن آگے کھسک گئے۔ ⚠️ کتاب میں نوٹ کرو: پرنٹڈ صفحہ 57 پر اس کوڈ کا آؤٹ پٹ غلط چھپا ہے — اس میں "Invite friends" نظر نہیں آتا اور پرانی لسٹ ہی دکھائی گئی ہے۔ صحیح آؤٹ پٹ وہی ہے جو اوپر دیا گیا ہے، کیونکہ insert() کا کام ہی آئٹم کو شامل کرنا ہے۔
۲۔ ڈیلیشن — دو طریقے۔ (الف) ویلیو سے — remove(): party_list.remove("Buy snacks") پہلی دفعہ ملنے والا "Buy snacks" ہٹا دیتا ہے، چاہے وہ کسی بھی انڈیکس پر ہو۔ (ب) انڈیکس سے — pop(): party_list.pop(0) انڈیکس 0 والا آئٹم ہٹا دیتا ہے۔ کتاب کی مثال میں pop(0) نے "Invite friends" ہٹایا تو باقی رہ گیا ['Buy decorations', 'Buy cold drinks']۔
۳۔ سرچنگ — in کی ورڈ سے چیک کرنا۔ if "Buy cold drinks" in party_list: صرف یہ پوچھتا ہے کہ آئٹم لسٹ میں ہے یا نہیں — True یا False۔ کتاب کے کوڈ میں یہ آئٹم موجود تھا، اس لیے آؤٹ پٹ آیا: "Buy cold drinks is on the list."
List صرف کتابی چیز نہیں — روزمرہ کے programs میں ہر جگہ نظر آتی ہے. پہلا بڑا استعمال Data Storage and Manipulation ہے: records, entries اور values کا ایک مجموعہ رکھنا. Students کے نام, test کے marks, دکان کے items — یہ سب lists میں رکہے جاتے ہیں کیوں کے ان میں insertion, deletion اور access تینوں آساں ہیں.
دوسرا استعمال تھوڑا گہرا ہے لیکن بہت اہم: lists سے ہی stacks اور queues بنائے جاتے ہیں. آگے اس chapter میں تم دیکھو گے کے stack کا push/pop Python میں list کے append() aur pop() سے ہی ہوتا ہے. مطلب list ایک بنیادی اینٹ (building block) ہے — اسے سمجھ لیا تو آگے کے structures سمجھنا آدھا آساں ہو جاتا ہے. اسی لیے کتاب lists کو "primitive computational structures" میں سب سے پہلے رکھتی ہے.
لسٹ صرف کتابی چیز نہیں — روزمرہ کے پروگراموں میں ہر جگہ نظر آتی ہے۔ پہلا بڑا استعمال ڈیٹا اسٹوریج اینڈ مینیپولیشن ہے: ریکارڈز، انٹریز اور ویلیوز کا ایک مجموعہ رکھنا۔ طلبہ کے نام، ٹیسٹ کے نمبرز، دکان کے آئٹمز — یہ سب لسٹس میں رکھے جاتے ہیں کیونکہ ان میں انسرشن، ڈیلیشن اور ایکسیس تینوں آسان ہیں۔
دوسرا استعمال تھوڑا گہرا ہے لیکن بہت اہم: لسٹس سے ہی اسٹیکس اور کیوز بنائے جاتے ہیں۔ آگے اس باب میں تم دیکھو گے کہ اسٹیک کا پش/پاپ پائتھن میں لسٹ کے append() اور pop() سے ہی ہوتا ہے۔ مطلب لسٹ ایک بنیادی اینٹ (بلڈنگ بلاک) ہے — اسے سمجھ لیا تو آگے کے سٹرکچرز سمجھنا آدھا آسان ہو جاتا ہے۔ اسی لیے کتاب لسٹس کو "پرمیٹیو کمپیوٹیشنل سٹرکچرز" میں سب سے پہلے رکھتی ہے۔
Stack کو سمجھنے کا سب سے آساں طریقہ کتابوں کا ڈھیر ہے — کتاب کی Figure 4.1 بھی یہی دکھاتی ہے. تم نئی کتاب ہمیشہ oopar رکھتے ہو, اور جب کوئی کتاب چاہیے ہوتی ہے تو سب سے اوپر والی ہی اٹھاتے ہو; نیچے والی کتاب تک pahonchnay کے لیے اوپر والی hatani پڑتی ہے. Stack میں insertion اور deletion دونوں صرف ایک ہی end پر ہوتے ہیں, جسے top کہتے ہیں.
Is usool ka naam LIFO — Last-In, First-Out ہے. مطلب جو item سب سے آخر میں آیا, وہ سب سے پہلے باہر جائے گا. کتابوں کی مثال میں: اگر تم نے پہلے Book A رکھی پھر Book B, تو Book B اوپر ہوگی اور پہلے وہی اٹھے گی. یہ اصول computer میں ہر جگہ ہے — browser کا Back button, undo (Ctrl+Z), اور function calls کا حساب, سب stack پر چلتے ہیں.
اسٹیک کو سمجھنے کا سب سے آسان طریقہ کتابوں کا ڈھیر ہے — کتاب کی فگر 4.1 بھی یہی دکھاتی ہے۔ تم نئی کتاب ہمیشہ اوپر رکھتے ہو، اور جب کوئی کتاب چاہیے ہوتی ہے تو سب سے اوپر والی ہی اٹھاتے ہو؛ نیچے والی کتاب تک پہنچنے کے لیے اوپر والی ہٹانی پڑتی ہے۔ اسٹیک میں انسرشن اور ڈیلیشن دونوں صرف ایک ہی اینڈ پر ہوتے ہیں، جسے ٹاپ کہتے ہیں۔
اس اصول کا نام LIFO — Last-In, First-Out ہے۔ مطلب جو آئٹم سب سے آخر میں آیا، وہ سب سے پہلے باہر جائے گا۔ کتابوں کی مثال میں: اگر تم نے پہلے Book A رکھی پھر Book B، تو Book B اوپر ہوگی اور پہلے وہی اٹھے گی۔ یہ اصول کمپیوٹر میں ہر جگہ ہے — براؤزر کا Back بٹن، انڈو (Ctrl+Z)، اور فنکشن کالز کا حساب، سب اسٹیک پر چلتے ہیں۔
Stack ke sirf do bunyadi operations ہیں. Push: item کو stack کے top پر add کرنا. Pop: top سے item کو remove کرنا. Python میں stack بنانے کے لیے الگ کوئی چیز نہیں چاہیے — ایک خالی list ہی stack بن جاتی ہے, append() push کا کام کرتا ہے اور pop() pop ka.
کتاب کے code کو line by line trace کرو:
stack_of_books = [] # khaali stack
stack_of_books.append('Book A') # push → ['Book A']
stack_of_books.append('Book B') # push → ['Book A', 'Book B']
top_book = stack_of_books.pop() # pop → 'Book B' nikla
print(stack_of_books) # ['Book A'] reh gayaDekho, pop() نے کوئی index نہیں manga — اس نے خود top والی چیز, یعنی آخری item 'Book B', نکال لی. کتاب کا جملہ یہی کہتا ہے: "the last book added is the first one taken off" — یہی LIFO کی زندہ مثال ہے. اگر دوبارہ pop کیا جائے تو اب 'Book A' نکلے گی, کیوں کے اب وہی top پر ہے.
اسٹیک کے صرف دو بنیادی آپریشنز ہیں۔ پش: آئٹم کو اسٹیک کے ٹاپ پر شامل کرنا۔ پاپ: ٹاپ سے آئٹم کو ہٹانا۔ پائتھن میں اسٹیک بنانے کے لیے الگ کوئی چیز نہیں چاہیے — ایک خالی لسٹ ہی اسٹیک بن جاتی ہے، append() پش کا کام کرتا ہے اور pop() پاپ کا۔
کتاب کے کوڈ کو لائن بہ لائن ٹریس کرو: stack_of_books = [] سے خالی اسٹیک بنتی ہے، append('Book A') سے لسٹ ['Book A'] ہو جاتی ہے، append('Book B') سے ['Book A', 'Book B']۔ پھر pop() نے کوئی انڈیکس نہیں مانگا — اس نے خود ٹاپ والی چیز، یعنی آخری آئٹم 'Book B'، نکال لی، اور آخر میں ['Book A'] رہ گیا۔ کتاب کا جملہ یہی کہتا ہے: آخری کتاب جو رکھی گئی، وہی پہلے اٹھائی گئی — یہی LIFO کی زندہ مثال ہے۔
Queue کا مطلب ہے line — بالکل ویسی line جیسی bank یا ticket counter کے سامنے لگتی ہے (کتاب کی Figure 4.2). جو شخص سب سے پہلے line میں لگا, اسے سب سے پہلے serve کیا جاتا ہے. Computer کی queue بھی یہی کرتی ہے: پہلے آیا ہوا item پہلے باہر جاتا ہے.
Is usool ka naam FIFO — First-In, First-Out ہے. Stack سے فرق سمجھ لو: stack میں دونوں کام ایک ہی end (top) پر ہوتے تھے; queue میں do alag ends ہوتے ہیں — نئے items back (rear) سے آتے ہیں اور پرانے items front سے نکلتے ہیں. بیچ میں گھسنا یا بیچ سے نکالنا allowed نہیں. Printer کی line, ticket booking اور کسی بھی "پہلے آؤ, پہلے pao" والی situation میں queue ہی استعمال ہوتی ہے.
کیو کا مطلب ہے لائن — بالکل ویسی لائن جیسی بینک یا ٹکٹ کاؤنٹر کے سامنے لگتی ہے (کتاب کی فگر 4.2)۔ جو شخص سب سے پہلے لائن میں لگا، اسے سب سے پہلے سروس دی جاتی ہے۔ کمپیوٹر کی کیو بھی یہی کرتی ہے: پہلے آیا ہوا آئٹم پہلے باہر جاتا ہے۔
اس اصول کا نام FIFO — First-In, First-Out ہے۔ اسٹیک سے فرق سمجھ لو: اسٹیک میں دونوں کام ایک ہی اینڈ (ٹاپ) پر ہوتے تھے؛ کیو میں دو الگ اینڈز ہوتے ہیں — نئے آئٹمز بیک (رئیر) سے آتے ہیں اور پرانے آئٹمز فرنٹ سے نکلتے ہیں۔ بیچ میں گھسنا یا بیچ سے نکلنا الاؤڈ نہیں۔ پرنٹر کی لائن، ٹکٹ بکنگ اور کسی بھی "پہلے آؤ، پہلے پاؤ" والی صورتحال میں کیو ہی استعمال ہوتی ہے۔
Queue کے دو بنیادی operations ہیں. Enqueue: item کو line کے آخر (back) میں لگانا. Dequeue: front سے item کو serve کر کے نکالنا. ان کے علاوہ تین مددگار کام بھی ہوتے ہیں: queue خالی ہے یا نہیں check کرنا, front والا item baghair nikale dekhna (peek), اور queue کا size معلوم کرنا.
کتاب کا Python code (printed p. 60) line by line trace کرو:
from queue import Queue
q = Queue() # nayi khaali queue
q.put("Ahmed") # enqueue → [Ahmed]
q.put("Fatima") # enqueue → [Ahmed, Fatima]
front_person = q.queue[0] # peek → "Ahmed" (nikala nahi)
removed_person = q.get() # dequeue → "Ahmed" nikla
q.put("Sara") # enqueue → [Fatima, Sara]دیکھو, peek نے صرف بتایا کے front پر Ahmed ہے, اسے ہٹایا نہیں; ہٹایا تب جب get() چلا. اور سارا آخر میں لگی, فاطمہ کے پیچھے — اس لیے updated queue [Fatima, Sara] bani. ⚠️ Naam ka note: عام زبان میں ان operations کو enqueue/dequeue کہتے ہیں, لیکن Python کے queue module میں وہی کام put() aur get() سے ہوتا ہے — exercise کے سوال اسی لیے دونوں نام استعمال کرتے ہیں.
کیو کے دو بنیادی آپریشنز ہیں۔ این کیو: آئٹم کو لائن کے آخر (بیک) میں لگانا۔ ڈی کیو: فرنٹ سے آئٹم کو سروس دے کر نکالنا۔ ان کے علاوہ تین مددگار کام بھی ہوتے ہیں: کیو خالی ہے یا نہیں چیک کرنا، فرنٹ والا آئٹم بغیر نکالے دیکھنا (پیک)، اور کیو کا سائز معلوم کرنا۔
کتاب کا پائتھن کوڈ (پرنٹڈ صفحہ 60) لائن بہ لائن ٹریس کرو: q.put("Ahmed") سے لائن [Ahmed] بنی، q.put("Fatima") سے [Ahmed, Fatima]۔ q.queue[0] نے صرف بتایا کہ فرنٹ پر Ahmed ہے، اسے ہٹایا نہیں؛ ہٹایا تب جب q.get() چلا۔ اور Sara آخر میں لگی، Fatima کے پیچھے — اس لیے اپڈیٹڈ کیو [Fatima, Sara] بنی۔ ⚠️ نام کا نوٹ: عام زبان میں ان آپریشنز کو این کیو/ڈی کیو کہتے ہیں، لیکن پائتھن کے queue ماڈیول میں وہی کام put() اور get() سے ہوتا ہے۔
List اور queue میں چیزیں ایک سیدھی line میں ہوتی ہیں — پیچھے ایک, آگے ایک. Tree اس سے بالکل مختلف ہے. Tree میں data ایک main point (root node) سے شروع ہوتا ہے اور پھر branches کی طرح پھیلتا ہے. ہر piece of information کو node کہتے ہیں, اور ایک node کئی دوسرے nodes سے جڑ سکتا ہے.
کتاب کی Figure 4.3 (family tree) اسے سب سے اچھی طرح سمجھاتی ہے: سب سے اوپر dada-دادی (ancestors) root کی طرح ہیں, ان کے نیچے father-mother اور uncle-aunt, اور ان کے نیچے بچے — brother, sister, "Me" اور cousins. یہ parent-child رشتہ list میں ٹھیک سے نہیں دیکھایا جا سکتا, کیوں کے list میں ہر item کا صرف ایک پیچھے اور ایک آگے ہوتا ہے; tree میں ایک parent کے کئی children ہو سکتے ہیں. اسی لیے hierarchical data — family tree, company کا organisation chart, computer کے folders — tree میں رکھا جاتا ہے.
لسٹ اور کیو میں چیزیں ایک سیدھی لائن میں ہوتی ہیں — پیچھے ایک، آگے ایک۔ ٹری اس سے بالکل مختلف ہے۔ ٹری میں ڈیٹا ایک مین پوائنٹ (روٹ نوڈ) سے شروع ہوتا ہے اور پھر برانچز کی طرح پھیلتا ہے۔ ہر پیس آف انفارمیشن کو نوڈ کہتے ہیں، اور ایک نوڈ کئی دوسرے نوڈز سے جڑ سکتا ہے۔
کتاب کی فگر 4.3 (فیملی ٹری) اسے سب سے اچھی طرح سمجھاتی ہے: سب سے اوپر دادا دادی (اینسیسٹرز) روٹ کی طرح ہیں، ان کے نیچے فادر مدر اور انکل آنٹ، اور ان کے نیچے بچے — برادر، سسٹر، "Me" اور کزنز۔ یہ پیرنٹ چائلڈ رشتہ لسٹ میں ٹھیک سے نہیں دکھایا جا سکتا، کیونکہ لسٹ میں ہر آئٹم کا صرف ایک پیچھے اور ایک آگے ہوتا ہے؛ ٹری میں ایک پیرنٹ کے کئی چلڈرن ہو سکتے ہیں۔ اسی لیے ہائرارکیکل ڈیٹا — فیملی ٹری، کمپنی کا آرگنائزیشن چارٹ، کمپیوٹر کے فولڈرز — ٹری میں رکھا جاتا ہے۔
1. Root Node: tree کا سب سے پہلا یا سب سے اوپر والا node. جیسے computer میں میں folder جس میں باقی تمام folders اور files ہوتی ہیں, ویسے ہی root سے پورا tree شروع ہوتا ہے. Root کا کوئی parent نہیں ہوتا.
2. Edges aur Nodes: nodes tree کے individual elements ہیں, اور ان کو جوڑنے والی lines کو edges کہتے ہیں. جس node کے کوئی child nodes نہ ہوں, اسے leaf کہتے ہیں — بالکل اس file کی طرح جو folder میں ہے لیکن اس کے اندر کوئی اور file نہیں. Family tree میں سب سے نیچے والے بچے leaves ہیں.
3. Height: root سے سب سے دور والے leaf تک کا سب سے لمبا راستہ. یہ بتاتا ہے کہ tree کتنا گہرا یا اونچا ہے. ⚠️ Counting note: کتاب height کو "longest path" کہتی ہے, اور exercise کا MCQ 5 اسی بنیاد پر edges کی تعداد کو صحیح جواب مانتا ہے (root سے deepest node تک edges). کچھ کتابیں nodes گن کر height بتاتی ہیں — وہ ایک زیادہ ہوگی — اس لیے exam میں کتاب کی definition (edges) استعمال کرو.
4. Balanced Trees: aik tree balanced کہلاتا ہے جب اس کی left اور right branches کی height تقریبا برابر ہو. اگر ایک طرف بہت لمبی اور دوسری طرف بہت چھوٹی ہو تو tree unbalanced کہلائے گا اور search دھیمی ہو سکتی ہے.
۱۔ روٹ نوڈ: ٹری کا سب سے پہلا یا سب سے اوپر والا نوڈ۔ جیسے کمپیوٹر میں مین فولڈر جس میں باقی تمام فولڈرز اور فائلز ہوتی ہیں، ویسے ہی روٹ سے پورا ٹری شروع ہوتا ہے۔ روٹ کا کوئی پیرنٹ نہیں ہوتا۔
۲۔ ایجز اور نوڈز: نوڈز ٹری کے انفرادی ایلیمنٹس ہیں، اور ان کو جوڑنے والی لائنز کو ایجز کہتے ہیں۔ جس نوڈ کے کوئی چائلڈ نوڈز نہ ہوں، اسے لیف کہتے ہیں — بالکل اس فائل کی طرح جو فولڈر میں ہے لیکن اس کے اندر کوئی اور فائل نہیں۔ فیملی ٹری میں سب سے نیچے والے بچے لیوز ہیں۔
۳۔ ہائیٹ: روٹ سے سب سے دور والے لیف تک کا سب سے لمبا راستہ۔ یہ بتاتا ہے کہ ٹری کتنا گہرا یا اونچا ہے۔ ⚠️ گنتی کا نوٹ: کتاب ہائیٹ کو "longest path" کہتی ہے، اور ایکسرسائز کا MCQ 5 اسی بنیاد پر ایجز کی تعداد کو صحیح جواب مانتا ہے (روٹ سے ڈیپسٹ نوڈ تک ایجز)۔ کچھ کتابیں نوڈز گن کر ہائیٹ بتاتی ہیں — وہ ایک زیادہ ہوگی — اس لیے امتحان میں کتاب کی تعریف (ایجز) استعمال کرو۔
۴۔ بیلنسڈ ٹریز: ایک ٹری بیلنسڈ کہلاتا ہے جب اس کی لیفٹ اور رائٹ برانچز کی ہائیٹ تقریباً برابر ہو۔ اگر ایک طرف بہت لمبی اور دوسری طرف بہت چھوٹی ہو تو ٹری ان بیلنسڈ کہلائے گا اور سرچ دھیمی ہو سکتی ہے۔
Trees صرف family tree بنانے کے لیے نہیں — computer کے اندر روز کام آتے ہیں. 1. File Systems (Pre-order): جب file system کا backup بنایا جاتا ہے تو pre-order traversal استعمال ہوتی ہے — پہلے root (directory) visit کرو, پھر recursively اس کے اندر کی چیزیں. اس طرح directory اپنے contents سے پہلے backup ہو جاتی ہے, جو backup کی ترتیب کے لیے ضروری ہے.
2. File System Deletion (Post-order): delete kartay waqt ulta tareeqa — post-order traversal. پہلے تمام sub-directories اور files delete کرو, پھر parent directory. اگر پہلے parent delete کر دیا جائے تو اندر کی چیزیں پھنس جائیں گی; post-order اسی غلطی سے بچاتا ہے.
3. Hierarchical Data Representation: organisation charts اور family trees جیسے data جن میں اوپر-نیچے کا رشتہ ہو, tree میں سب سے صاف نظر آتے ہیں. 4. Decision Making: decision trees میں ہر node ایک شرط ہوتی ہے اور ہر branch ایک ممکن نتیجہ — algorithm شرط در شرط آگے بڑھ کر فیصلہ کرتا ہے.
ٹریز صرف فیملی ٹری بنانے کے لیے نہیں — کمپیوٹر کے اندر روز کام آتے ہیں۔ ۱۔ فائل سسٹمز (پری آرڈر): جب فائل سسٹم کا بیک اپ بنایا جاتا ہے تو پری آرڈر ٹریورسل استعمال ہوتی ہے — پہلے روٹ (ڈائریکٹری) وزٹ کرو، پھر ریکرسیولی اس کے اندر کی چیزیں۔ اس طرح ڈائریکٹری اپنے کنٹینٹس سے پہلے بیک اپ ہو جاتی ہے، جو بیک اپ کی ترتیب کے لیے ضروری ہے۔
۲۔ فائل سسٹم ڈیلیشن (پوسٹ آرڈر): ڈیلیٹ کرتے وقت الٹا طریقہ — پوسٹ آرڈر ٹریورسل۔ پہلے تمام سب ڈائریکٹریز اور فائلز ڈیلیٹ کرو، پھر پیرنٹ ڈائریکٹری۔ اگر پہلے پیرنٹ ڈیلیٹ کر دیا جائے تو اندر کی چیزیں پھنس جائیں گی؛ پوسٹ آرڈر اسی غلطی سے بچاتا ہے۔
۳۔ ہائرارکیکل ڈیٹا ریپریزنٹیشن: آرگنائزیشن چارٹس اور فیملی ٹریز جیسے ڈیٹا جن میں اوپر نیچے کا رشتہ ہو، ٹری میں سب سے صاف نظر آتے ہیں۔ ۴۔ ڈیسیژن میکنگ: ڈیسیژن ٹریز میں ہر نوڈ ایک شرط ہوتی ہے اور ہر برانچ ایک ممکن نتیجہ — الگورتھم شرط بہ شرط آگے بڑھ کر فیصلہ کرتا ہے۔
Tree میں ہر چیز کی ایک جگہ ہوتی ہے — اوپر root, نیچے branches. Graph اس پابندی کو توڑ دیتا ہے. Graph ایک ایسا structure ہے جو vertices (nodes) کے ایک set اور ان کو جوڑنے والی edges پر مشتمل ہوتا ہے. Vertices کچھ بھی ہو سکتے ہیں — شہر, log, websites — اور edges ان کے درمیان رشتہ یا راستہ بتاتی ہیں.
کتاب کی مثال لو: Pakistan کے تمام شہروں کا نقشہ بناؤ. ہر شہر ایک vertex, aur shehron ke darmiyan har road aik edge. Social network میں بھی یہی ہے: ہر شخص ایک vertex, اور دوستی ایک edge. Tree کے bar-عکس graph کا کوئی ایک "root" نہیں ہوتا اور کوئی hierarchy نہیں ہوتی — کوئی بھی vertex کسی بھی vertex سے جڑ سکتا ہے, اور یہ جال (web) جیسا دکھتا ہے.
ٹری میں ہر چیز کی ایک جگہ ہوتی ہے — اوپر روٹ، نیچے برانچز۔ گراف اس پابندی کو توڑ دیتا ہے۔ گراف ایک ایسا سٹرکچر ہے جو ورٹیسز (نوڈز) کے ایک سیٹ اور ان کو جوڑنے والی ایجز پر مشتمل ہوتا ہے۔ ورٹیسز کچھ بھی ہو سکتے ہیں — شہر، لوگ، ویب سائٹس — اور ایجز ان کے درمیان رشتہ یا راستہ بتاتی ہیں۔
کتاب کی مثال لو: پاکستان کے تمام شہروں کا نقشہ بناؤ۔ ہر شہر ایک ورٹیکس، اور شہروں کے درمیان ہر روڈ ایک ایجز۔ سوشل نیٹ ورک میں بھی یہی ہے: ہر شخص ایک ورٹیکس، اور دوستی ایک ایجز۔ ٹری کے برعکس گراف کا کوئی ایک "روٹ" نہیں ہوتا اور کوئی ہائرارکی نہیں ہوتی — کوئی بھی ورٹیکس کسی بھی ورٹیکس سے جڑ سکتا ہے، اور یہ جال (ویب) جیسا دکھتا ہے۔
Graph کو سمجھنے کے لیے تین لفظ کافی ہیں. Degree: کسی vertex سے کتنی edges جڑی ہوئی ہیں, وہی اس vertex کی degree ہے. کتاب کی مثال: اگر ایک شہر تین دوسرے شہروں سے جڑا ہے تو اس vertex کی degree 3 ہے. Degree بتاتی ہے کہ وہ point کتنا "connected" ہے.
Weight: کچھ graphs میں ہر edge پر ایک number لکھا ہوتا ہے — distance, وقت یا cost. مثال: دو شہروں کے درمیان road 50 kilometre لمبی ہے تو اس edge کا weight 50 ہوگا. Weight والے graphs سے shortest یا cheapest راستہ نکالا جاتا ہے.
Direction: edge ایک طرف کی ہو سکتی ہے یا دونوں طرف کی. Directed edge one-way ہوتی ہے — شہر A سے شہر B تک road ہے, اس کا مطلب یہ نہیں کہ B سے A تک بھی وہی road ہے. Undirected edge two-way ہوتی ہے — دونوں طرف سفر ممکن ہے. (کتاب میں 4.1.5.1 "Characteristics" کے نام پر کوئی الگ list نہیں دی گئی; اصل تفصیل 4.1.5.2 Properties میں ہے, اس لیے دونوں یہاں ایک ساتھ سمجھائی گئی ہیں.)
گراف کو سمجھنے کے لیے تین لفظ کافی ہیں۔ ڈگری: کسی ورٹیکس سے کتنی ایجز جڑی ہوئی ہیں، وہی اس ورٹیکس کی ڈگری ہے۔ کتاب کی مثال: اگر ایک شہر تین دوسرے شہروں سے جڑا ہے تو اس ورٹیکس کی ڈگری 3 ہے۔ ڈگری بتاتی ہے کہ وہ پوائنٹ کتنا "کنیکٹڈ" ہے۔
ویٹ: کچھ گرافس میں ہر ایجز پر ایک نمبر لکھا ہوتا ہے — ڈسٹنس، وقت یا لاگت۔ مثال: دو شہروں کے درمیان روڈ 50 کلومیٹر لمبی ہے تو اس ایجز کا ویٹ 50 ہوگا۔ ویٹ والے گرافس سے شارٹسٹ یا چیپسٹ راستہ نکالا جاتا ہے۔
ڈائریکشن: ایجز ایک طرف کی ہو سکتی ہے یا دونوں طرف کی۔ ڈائریکٹڈ ایجز ون وے ہوتی ہے — شہر A سے شہر B تک روڈ ہے، اس کا مطلب یہ نہیں کہ B سے A تک بھی وہی روڈ ہے۔ ان ڈائریکٹڈ ایجز ٹو وے ہوتی ہے — دونوں طرف سفر ممکن ہے۔ (کتاب میں 4.1.5.1 "Characteristics" کے نام پر کوئی الگ لسٹ نہیں دی گئی؛ اصل تفصیل 4.1.5.2 Properties میں ہے، اس لیے دونوں یہاں ایک ساتھ سمجھائی گئی ہیں۔)
1. Directed Graphs: جن میں edges کی direction ہوتی ہے — وہ ایک vertex سے دوسرے تک ایک خاص طرف جاتی ہیں. کتاب کی Figure 4.4 ایک directed weighted graph ہے: B→A (10), A→C (12), A→D (60), C→D (32), C→B (20), E→A (7). اب کتاب کی مثال حل کرو: کیا تم A سے سیدھا B جا سکتے ہو? نہیں — A سے نکلنے والی edges صرف C اور D کی طرف جاتی ہیں, B کی طرف کوئی تیر نہیں. A سے B جانے کے لیے راستہ A→C→B ہے, جس کا total weight 12 + 20 = 32 بنتا ہے.
2. Undirected Graphs: جن میں edges کی کوئی direction نہیں ہوتی — connection ہے تو دونوں طرف سفر ممکن ہے. Figure 4.5 میں A–B, B–C, B–D, B–E, A–E, C–D, D–E سب بغیر تیر کے ہیں. کتاب کی مثال: اگر Person A, Person B کا دوست ہے تو Person B بھی Person A کا دوست ہے — دوستی one-way نہیں ہوتی, اس لیے undirected graph ٹھیک ہے.
3. Weighted Graphs: جن میں ہر edge پر weight (distance, time ya cost) لکھا ہوتا ہے — جیسا Figure 4.4 میں ہے. شہر کے نقشے کی مثال لو: ہر road پر اس کا فاصلہ یا travel time لکھا ہو تو تم shortest یا quickest راستہ chun سکتے ہو. Directed/undirected بتاتا ہے kis taraf جا سکتے ہو, weighted بتاتا ہے kitni cost par.
۱۔ ڈائریکٹڈ گرافس: جن میں ایجز کی ڈائریکشن ہوتی ہے — وہ ایک ورٹیکس سے دوسرے تک ایک خاص طرف جاتی ہیں۔ کتاب کی فگر 4.4 ایک ڈائریکٹڈ ویٹڈ گراف ہے: B→A (10)، A→C (12)، A→D (60)، C→D (32)، C→B (20)، E→A (7)۔ اب کتاب کی مثال حل کرو: کیا تم A سے سیدھا B جا سکتے ہو؟ نہیں — A سے نکلنے والی ایجز صرف C اور D کی طرف جاتی ہیں، B کی طرف کوئی تیر نہیں۔ A سے B جانے کے لیے راستہ A→C→B ہے، جس کا ٹوٹل ویٹ 12 + 20 = 32 بنتا ہے۔
۲۔ ان ڈائریکٹڈ گرافس: جن میں ایجز کی کوئی ڈائریکشن نہیں ہوتی — کنکشن ہے تو دونوں طرف سفر ممکن ہے۔ فگر 4.5 میں A–B، B–C، B–D، B–E، A–E، C–D، D–E سب بغیر تیر کے ہیں۔ کتاب کی مثال: اگر Person A، Person B کا دوست ہے تو Person B بھی Person A کا دوست ہے — دوستی ون وے نہیں ہوتی، اس لیے ان ڈائریکٹڈ گراف ٹھیک ہے۔
۳۔ ویٹڈ گرافس: جن میں ہر ایجز پر ویٹ (ڈسٹنس، ٹائم یا لاگت) لکھا ہوتا ہے — جیسا فگر 4.4 میں ہے۔ شہر کے نقشے کی مثال لو: ہر روڈ پر اس کا فاصلہ یا ٹریول ٹائم لکھا ہو تو تم شارٹسٹ یا کوئکسٹ راستہ چن سکتے ہو۔ ڈائریکٹڈ/ان ڈائریکٹڈ بتاتا ہے کس طرف جا سکتے ہو، ویٹڈ بتاتا ہے کتنی لاگت پر۔
Chapter کے Student Learning Outcomes میں ایک بات خاص ہے: صرف structures کے نام یاد کرنا کافی نہیں — maslay ke hisaab se sahi structure chunna آنا چاہیے. یہ section کتاب کے SLOs اور introduction سے لیا گیا خلاصہ ہے (کتاب میں اس کے لیے کوئی الگ heading نہیں ہے, اس لیے اسے derived guidance سمجھو).
سیدھا اصول یہ ہے: tartib wali list چاہیے تو list; aakhri aaya pehle jaye (undo, back button) to stack; pehle aaya pehle jaye (ticket line, printer) to queue; oopar-neechay ka rishta (folders, family) to tree; jaal jaisa rishta (dosti, roads, networks) تو graph. اور اکثر ایک مسئلہ ایک structure سے حل نہیں ہوتا — مثال کے طور پر ایک network app میں graph roads بتائے گا اور queue requests کو ترتیب سے چلائے گی. Structures کو combine کرنا ہی اصل programming ہے.
باب کے اسٹوڈنٹ لرننگ آؤٹکمز میں ایک بات خاص ہے: صرف سٹرکچرز کے نام یاد کرنا کافی نہیں — مسئلے کے حساب سے صحیح سٹرکچر چننا آنا چاہیے۔ یہ سیکشن کتاب کے SLOs اور انٹروڈکشن سے لیا گیا خلاصہ ہے (کتاب میں اس کے لیے کوئی الگ ہیڈنگ نہیں ہے، اس لیے اسے ڈیرائیوڈ گائیڈنس سمجھو)۔
سیدھا اصول یہ ہے: ترتیب والی لسٹ چاہیے تو لسٹ؛ آخری آیا پہلے جائے (انڈو، بیک بٹن) تو اسٹیک؛ پہلے آیا پہلے جائے (ٹکٹ لائن، پرنٹر) تو کیو؛ اوپر نیچے کا رشتہ (فولڈرز، فیملی) تو ٹری؛ جال جیسا رشتہ (دوستی، روڈز، نیٹ ورکس) تو گراف۔ اور اکثر ایک مسئلہ ایک سٹرکچر سے حل نہیں ہوتا — مثال کے طور پر ایک نیٹ ورک ایپ میں گراف روڈز بتائے گا اور کیو ریکویسٹس کو ترتیب سے چلائے گی۔ سٹرکچرز کو کمبائن کرنا ہی اصل پروگرامنگ ہے۔
Below are all questions of the chapter exercise from Unit 4 of the official book (printed pages 65–66): 6 multiple-choice, 6 short and 5 long questions = 22 answer blocks (long questions کے English اور Urdu جواب الگ-الگ blocks میں دیے گئے ہیں). تھے book has no inquisitive, review or numerical section ان this unit, so none اس invented here. MCQ keys book کے final Answers section (printed p. 141, Unit 4) سے cross-check کی گئی ہیں: 1-b, 2-c, 3-b, 4-c, 5-a, 6-c. جہاں جواب derived ہے یا کتاب میں غلطی ہے, وہاں answer میں صاف لکھا گیا ہے.
1. The function used to add an item at the end of a list in Python:
Answer: (b) append() — append() list کے آخر میں item جوڑتا ہے; insert() کسی خاص index پر ڈالتا ہے, remove() ہٹاتا ہے اور pop() index سے نکلتا ہے. append() لسٹ کے آخر میں آئٹم جوڑتا ہے؛ insert() کسی خاص انڈیکس پر ڈالتا ہے، remove() ہٹاتا ہے اور pop() انڈیکس سے نکالتا ہے۔
2. The purpose of the in keyword used with a Python list:
Answer: (c) Checks if an item exists in the list — ان صرف موجودگی check کرتا ہے (True/False); length کے لیے len() ہوتا ہے, add کے لیے append()/insert() اور remove کے لیے remove()/pop(). in صرف موجودگی چیک کرتا ہے (True/False)؛ لمبائی کے لیے len() ہوتا ہے، شامل کرنے کے لیے append()/insert() اور ہٹانے کے لیے remove()/pop()۔
3. An operation that removes an item from the top of the stack:
Answer: (b) Pop — Pop top سے item نکلتا ہے; push top پر ڈالتا ہے; peek صرف دیکھتا ہے, ہٹاتا نہیں. Pop ٹاپ سے آئٹم نکالتا ہے؛ Push ٹاپ پر ڈالتا ہے؛ Peek صرف دیکھتا ہے، ہٹاتا نہیں۔
4. The operation used to add an item to a queue:
Answer: (c) Enqueue — Enqueue back پر item لگاتا ہے; dequeue front سے نکلتا ہے; peek صرف front دکھاتا ہے. Enqueue بیک پر آئٹم لگاتا ہے؛ Dequeue فرنٹ سے نکالتا ہے؛ Peek صرف فرنٹ دیکھتا ہے۔
5. True statement about the height of a tree:
Answer: (a) Number of edges from the root to the deepest node — کتاب height کو root سے farthest leaf تک longest path کہتی ہے اور اسے edges میں گنتی ہے; nodes گننے پر جواب ایک زیادہ آتا, اس لیے (b) غلط ہے. کتاب ہائیٹ کو روٹ سے فارتھسٹ لیف تک لانگسٹ پاتھ کہتی ہے اور اسے ایجز میں گنتی ہے؛ نوڈز گننے پر جواب ایک زیادہ آتا، اس لیے (b) غلط ہے۔
6. A scenario where a graph data structure is most suitable:
Answer: (c) Representing connections in a social network — تو-دو list کے لیے list اور customers کی line کے لیے queue بہتر ہے; social network کا جال جیسا رشتہ صرف graph ٹھیک سے دکھاتے ہے. ٹو ڈو لسٹ کے لیے لسٹ اور کسٹمرز کی لائن کے لیے کیو بہتر ہے؛ سوشل نیٹ ورک کا جال جیسا رشتہ صرف گراف ٹھیک سے دکھاتا ہے۔
insert(index, item) list میں item کو کسی خاص index پر ڈالتا ہے اور باقی items کو ایک position آگے کھسکا دیتا ہے. مثال: party_list = ["Buy drinks", "Buy decorations"] par party_list.insert(0, "Invite friends") chalanay se list ['Invite friends', 'Buy drinks', 'Buy decorations'] بن جاتی ہے. یاد رکھو, کتاب کے printed page 57 پر اس مثال کا output غلط چھپا ہے — صحیح output میں 'Invite friends' سب سے پہلے ضرور آتا ہے. insert() آئٹم کو کسی خاص انڈیکس پر ڈالتا ہے اور باقی آئٹمز کو ایک پوزیشن آگے کھسکا دیتا ہے۔
⚠️ Derived answer — کتاب کے اس chapter میں aliasing پر کوئی dedicated passage نہیں ہے. جب دو variables ایک ہی list کی طرف اشارہ کرتے ہیں, مثلاً a = [1, 2, 3]; b = a, to b الگ copy نہیں بناتا — دونوں ایک ہی list ہیں. پھر b.append(4) کرنے سے a bhi [1, 2, 3, 4] ہو جائے گا, کیوں کے change ایک ہی list میں ہوا. مسئلہ یہ ہے کہ programmer سمجھتا ہے کہ صرف ایک variable بدلہ ہے, لیکن دوسرا بھی بدل جاتا ہے. حل: اصلی copy کے لیے b = a.copy() ya b = a[:] likho. دو ویری ایبلز ایک ہی لسٹ کی طرف اشارہ کریں تو ایک میں تبدیلی دوسرے میں بھی نظر آتی ہے، کیونکہ دونوں ایک ہی لسٹ ہیں۔
Stack ایک ایسی data structure ہے جس میں insertion اور deletion صرف ایک end — top — پر ہوتے ہیں. LIFO کا مطلب ہے Last-In, First-Out: جو item سب سے آخر میں آیا, وہ سب سے پہلے باہر جائے گا. کتابوں کے ڈھیر کی مثال: Book A کے اوپر Book B رکھی تو پہلے Book B اٹھے گی, پھر Book A. Python میں push append() se aur pop pop() سے ہوتا ہے. اسٹیک میں انسرشن اور ڈیلیشن صرف ٹاپ پر ہوتے ہیں، اور LIFO کا مطلب ہے جو آخر میں آیا وہ پہلے باہر جائے گا۔
Enqueue item کو queue کے back (aakhir) میں لگاتا ہے — line میں نیا شخص پیچھے لگتا ہے. Dequeue front (shuru) سے item کو نکلتا ہے — line میں سب سے آگے والا serve ہوتا ہے. Enqueue size بڑھاتا ہے, dequeue size ghatata ہے; دونوں مل کر FIFO اصول بناتے ہیں. Python کے queue module میں یہی کام put() (enqueue) aur get() (dequeue) سے ہوتا ہے. Enqueue آئٹم کو پیچھے لگاتا ہے اور Dequeue آگے سے نکالتا ہے؛ دونوں مل کر FIFO اصول بناتے ہیں۔
Stack کے دو بنیادی operations ہیں: 1. Push — item کو top پر add کرنا; 2. Pop — top سے item کو remove کرنا. (Peek — top کو بغیر نکالے دیکھنا — ایک مددگار operation ہے, لیکن کتاب بنیادی operations کے طور پر صرف push اور pop گنواتی ہے.) اسٹیک کے دو بنیادی آپریشنز پش اور پاپ ہیں — پش اوپر ڈالتا ہے، پاپ اوپر سے نکالتا ہے۔
⚠️ Naam ka note: کتاب کے queue code میں یہ کام put() aur get() سے ہوتا ہے; enqueue/dequeue انہی کے عام نام ہیں. Enqueue = item کو back میں شامل کرنا; Dequeue = front سے item کو نکالنا. فرق صرف end کا ہے — ایک اندر لاتا ہے (peechay se), دوسرا باہر لے جاتا ہے (آگے سے) — اور اسی فرق سے FIFO بنتا ہے. Enqueue آئٹم کو پیچھے سے شامل کرتا ہے اور Dequeue آگے سے نکالتا ہے — یہی فرق FIFO بناتا ہے۔
Python کی list کا size پہلے سے fixed نہیں ہوتا — یہی dynamic size ہے. تم list بنانے کے بعد jitnay چاہو items add کر سکتے ہو (append()/insert() se) ya hata sakte ho (remove()/pop() سے), اور list خود اپنی جگہ (memory) کو adjust کر لیتی ہے. Flexibility اسی میں ہے: اگر students کی list میں نیا student آئے تو پوری list دوبارہ بنانے کی ضرورت نہیں; اگر کوئی چلا جائے تو خالی جگہ کا مسئلہ نہیں. Fixed-size arrays میں پہلے سے size بتانا پڑتا ہے اور bad میں تبدیلی مشکل ہوتی ہے — list اس پابندی کو ختم کر دیتی ہے, اس لیے وہ records, تو-دو lists اور ہر بدلتے huay data کے لیے بہترین ہے.
Stack کے دو operations ہیں — push (top par add) aur pop (top se remove) — اور اصول LIFO ہے. Real-life مثال: کتابوں کا ڈھیر, یا browser کا Back button (آخری خولہ ہوا page پہلے واپس آتا ہے). Python code (کتاب, p. 59): stack_of_books = [] se khaali stack; append('Book A') phir append('Book B') se stack ['Book A', 'Book B']; pop() se 'Book B' nikli aur ['Book A'] رہ گیا. یہی trace دکھاتے ہے کہ آخری آئی چیز پہلے گئی.
کتاب کے queue module والے طریقے سے (p. 60): from queue import Queue; q = Queue(); q.put("Ahmed"); q.put("Fatima") — یہ insertion (enqueue) ہے, queue [Ahmed, Fatima]. Deletion (dequeue) removed_person = q.get() سے ہوتی ہے, جو 'Ahmed' نکلتا ہے کیوں کے وہ front پر تھا; پھر q.put("Sara") se queue [Fatima, Sara] بن جاتی ہے. اگر list سے queue بنانا ہو تو append() enqueue aur pop(0) dequeue کا کام کرتا ہے, لیکن بڑا data پر queue module زیادہ بہتر ہے.
Tree ایک hierarchical data structure ہے جس میں data ایک root node سے شروع ہو کر branches میں پھیلتا ہے; ہر node کئی children سے جڑ سکتا ہے. Properties: Root node — سب سے اوپر والا node, جس کا کوئی parent نہیں; Nodes aur edges — nodes elements ہیں, edges ان کو جوڑنے والی lines; Leaf — woh node jis ka koi child na ho; Height — root سے farthest leaf تک longest path (edges میں); Balanced tree — jis ki left aur right branches ki height taqreeban barabar ho. Misaal: family tree, file system ke folders.
Graph vertices (nodes) اور ان کو جوڑنے والی edges پر مشتمل structure ہے جو networks اور connections دکھاتے ہے — شہر اور roads, log اور دوستی اس کی مثالیں ہیں. Directed graph میں ہر edge کی direction ہوتی ہے (teer): A→B کا مطلب صرف A سے B جا سکتے ہو, واپس نہیں — جیسا Figure 4.4 میں A سے سیدھا B کا کوئی راستہ نہیں, صرف A→C→B ہے. Undirected graph میں edge دونوں طرف چلتی ہے: A–B ہے تو B–A بھی ہے — جیسا Figure 4.5 میں دوستی دونوں طرف برابر ہے. تیسری type, weighted graph, ہر edge پر distance/time/cost کا number بھی رکھتا ہے.
پائتھن کی لسٹ کا سائز پہلے سے فکسڈ نہیں ہوتا — یہی ڈائنامک سائز ہے۔ تم لسٹ بنانے کے بعد جتنے چاہو آئٹمز شامل کر سکتے ہو (append()/insert() سے) یا ہٹا سکتے ہو (remove()/pop() سے)، اور لسٹ خود اپنی جگہ کو ایڈجسٹ کر لیتی ہے۔ لچک اسی میں ہے: اگر طلبہ کی لسٹ میں نیا طالب علم آئے تو پوری لسٹ دوبارہ بنانے کی ضرورت نہیں؛ اگر کوئی چلا جائے تو خالی جگہ کا مسئلہ نہیں۔ فکسڈ سائز والے اریز میں پہلے سے سائز بتانا پڑتا ہے اور بعد میں تبدیلی مشکل ہوتی ہے — لسٹ اس پابندی کو ختم کر دیتی ہے۔
اسٹیک کے دو آپریشنز ہیں — پش (ٹاپ پر شامل کرنا) اور پاپ (ٹاپ سے ہٹانا) — اور اصول LIFO ہے۔ حقیقی زندگی کی مثال: کتابوں کا ڈھیر، یا براؤزر کا Back بٹن (آخری کھولا ہوا پیج پہلے واپس آتا ہے)۔ پائتھن کوڈ (کتاب، صفحہ 59): stack_of_books = [] سے خالی اسٹیک؛ append('Book A') پھر append('Book B') سے اسٹیک ['Book A', 'Book B']؛ pop() سے 'Book B' نکلی اور ['Book A'] رہ گیا۔ یہی ٹریس دکھاتا ہے کہ آخری آئی چیز پہلے گئی۔
کتاب کے کیو ماڈیول والے طریقے سے (صفحہ 60): from queue import Queue; q = Queue(); q.put("Ahmed"); q.put("Fatima") — یہ انسرشن (این کیو) ہے، کیو [Ahmed, Fatima]۔ ڈیلیشن (ڈی کیو) removed_person = q.get() سے ہوتی ہے، جو 'Ahmed' نکالتا ہے کیونکہ وہ فرنٹ پر تھا؛ پھر q.put("Sara") سے کیو [Fatima, Sara] بن جاتی ہے۔ اگر لسٹ سے کیو بنانا ہو تو append() این کیو اور pop(0) ڈی کیو کا کام کرتا ہے، لیکن بڑے ڈیٹا پر کیو ماڈیول زیادہ بہتر ہے۔
ٹری ایک ہائرارکیکل ڈیٹا سٹرکچر ہے جس میں ڈیٹا ایک روٹ نوڈ سے شروع ہو کر برانچز میں پھیلتا ہے؛ ہر نوڈ کئی چلڈرن سے جڑ سکتا ہے۔ خصوصیات: روٹ نوڈ — سب سے اوپر والا نوڈ، جس کا کوئی پیرنٹ نہیں؛ نوڈز اور ایجز — نوڈز ایلیمنٹس ہیں، ایجز ان کو جوڑنے والی لائنز؛ لیف — وہ نوڈ جس کا کوئی چائلڈ نہ ہو؛ ہائیٹ — روٹ سے فارتھسٹ لیف تک لانگسٹ پاتھ (ایجز میں)؛ بیلنسڈ ٹری — جس کی لیفٹ اور رائٹ برانچز کی ہائیٹ تقریباً برابر ہو۔ مثال: فیملی ٹری، فائل سسٹم کے فولڈرز۔
گراف ورٹیسز (نوڈز) اور ان کو جوڑنے والی ایجز پر مشتمل سٹرکچر ہے جو نیٹ ورکس اور کنکشنز دکھاتا ہے — شہر اور روڈز، لوگ اور دوستی اس کی مثالیں ہیں۔ ڈائریکٹڈ گراف میں ہر ایجز کی ڈائریکشن ہوتی ہے (تیر): A→B کا مطلب صرف A سے B جا سکتے ہو، واپس نہیں — جیسا فگر 4.4 میں A سے سیدھا B کا کوئی راستہ نہیں، صرف A→C→B ہے۔ ان ڈائریکٹڈ گراف میں ایجز دونوں طرف چلتی ہے: A–B ہے تو B–A بھی ہے — جیسا فگر 4.5 میں دوستی دونوں طرف برابر ہے۔ تیسری قسم، ویٹڈ گراف، ہر ایجز پر ڈسٹنس/ٹائم/کاسٹ کا نمبر بھی رکھتا ہے۔
اس chapter میں تم نے سیکھا کے data کو ترتیب دینے کے پانچ بنیادی طریقے ہیں: list (tartib wali sequence, index 0 se), stack (LIFO — aakhri aaya pehle gaya), queue (FIFO — pehle aaya pehle gaya), tree (root se phailti hierarchy) aur graph (vertices اور edges کا جال). ہر structure کے operations, Python code اور real-life مثالیں — party list, کتابوں کا ڈھیر, bank کی line, family tree اور شہروں کا نقشہ — اس chapter کی جان ہیں.
Revision guidance: exam سے پہلے تین چیزیں پکی کرو — (1) insert/remove/pop/ان کی فرق اور code trace, (2) LIFO vs FIFO ایک line میں, (3) directed vs undirected graph اور Figure 4.4 کا A→C→B راستہ (weight 32). ان تینوں پر عبور ہو تو exercise کے MCQs اور short questions آساں لگیں گے.
اس باب میں تم نے سیکھا کہ ڈیٹا کو ترتیب دینے کے پانچ بنیادی طریقے ہیں: لسٹ (ترتیب والی سیکوئنس، انڈیکس 0 سے)، اسٹیک (LIFO — آخری آیا پہلے گیا)، کیو (FIFO — پہلے آیا پہلے گیا)، ٹری (روٹ سے پھیلتی ہائرارکی) اور گراف (ورٹیسز اور ایجز کا جال)۔ ہر سٹرکچر کے آپریشنز، پائتھن کوڈ اور حقیقی زندگی کی مثالیں — پارٹی لسٹ، کتابوں کا ڈھیر، بینک کی لائن، فیملی ٹری اور شہروں کا نقشہ — اس باب کی جان ہیں۔
دہرائی کی رہنمائی: امتحان سے پہلے تین چیزیں پکی کرو — (۱) insert/remove/pop/in کا فرق اور کوڈ ٹریس، (۲) LIFO بمقابلہ FIFO ایک لائن میں، (۳) ڈائریکٹڈ بمقابلہ ان ڈائریکٹڈ گراف اور فگر 4.4 کا A→C→B راستہ (ویٹ 32)۔ ان تینوں پر عبور ہو تو ایکسرسائز کے MCQs اور مختصر سوالات آسان لگیں گے۔
Chapter-wise tests, fresh random papers اور instant score کے لیے PunjabTest.com کا میں test section دیکھو:
PunjabTest.com — Complete Guide Book • FSc Part 1 Computer Science, Chapter 4 (New Book, Session 2026–27) • English + Urdu