பைத்தான் நிரலாக்க மொழிக்கு உண்டான அடிப்படை தரவு கட்டமைப்புகளை ஆரம்பக்கட்ட அத்தியாயங்களில் விரிவாகப் பார்த்திருந்தோம். இனி பார்க்க இருப்பது மேம்பட்ட சில த.கட்டமைப்புகளை, இவை எல்லா நிரலாக்க மொழிகளுக்கும் பொதுவானவை. இவற்றைக் கற்பதன் மூலம் தரவுகள் எங்கே, எப்படிச் சேமிக்கப்பட வேண்டும் என்பதில் கூடுதல் கட்டுப்பாட்டை நிரலாளர் பெறுகிறார். அடுக்கு(stack), வரிசை(queue), நெடுவரிசை(array), தொடுப்புப் பட்டியல்(linked list) ஆகியவை பொதுவாகப் பயன்படுத்தப்படும் மேம்பட்ட த.கட்டமைப்புகள் ஆகும்.
1) அடுக்கு
கடைபுகு-முதல்விடு என்கிற அடிப்படையில் இந்த த.கட்டமைப்பு இயங்குகிறது. அதாவது எந்தவொரு அடுக்கிலும் சேமிக்கப்படும் தரவுகளில் கடைசியாக எது உள்ளீடு செய்யப்பட்டதோ, அதை முதலில் வெளியே எடுக்க வேண்டும். அன்றாட வாழ்வில் இதற்கு நிறைய உதாரணங்களைச் சொல்ல முடியும். பெண்கள் தங்கள் கைகளில் அணிந்திருக்கும் வளையல்களைக் கழட்டும் விதத்தைக் கவனித்து இருக்கிறீர்களா? கடைசியாக கைக்குள் நுழைந்த வளையலே முதலில் வெளியே வரும்.
இதை அப்படியே ஒரு த.கட்டமைப்பாக மாற்றினால் அதன் பெயர் அடுக்கு. அடிப்படை த.கட்டமைப்புகளை உருவாக்கிப் பயன்படுத்த பைத்தான் நிரலாக்க மொழியே நமக்கு நிறைய மு.வ.செயல்பாடுகளை வழங்கியது. அவற்றைக்கொண்டு மேம்பட்ட த.கட்டமைப்புகளை நாமே நிரலின் மூலம் உருவாக்கிக்கொள்ளலாம்.
அடுக்கு த.கட்டமைப்பைப் பொறுத்தவரையில், தரவுகளை ஒன்றன்பின் ஒன்றாக மட்டுமே எடுத்துப் பயன்படுத்த முடியும். இதனை நேரோட்ட த.கட்டமைப்பு(Linear Data Structures) என்ற பெயரிலும் அழைக்கலாம்.
நிரல் 1: அடுக்கை உருவாக்குதல்
மேம்பட்ட த.கட்டமைப்புகள் அனைத்தையும் பட்டியலைக்கொண்டே உருவாக்க முடியும், இந்நிரலில் நாம் அதைத்தான் செய்திருக்கிறோம். நான்கு இயக்கங்களை அடுக்கு த.கட்டமைப்பில் மேற்கொள்ள இருக்கிறோம்.
1) Push, அடுக்கில் (கடைசியில்) தரவுகளைச் சேமிப்பது
2) Pop, அடுக்கில் கடைசியாகச் சேமிக்கப்பட்ட தரவுகளை நீக்குவது
3) top, அடுக்கின் உச்சியில் உள்ள தரவைப் பெறுவது
4) isempty, அடுக்கு காலியாக இருக்கிறதா என்று பார்ப்பது
இந்த நான்கு இயக்கங்களுக்கும் முறையே நான்கு செயல்பாடுகளை உருவாக்கி இருக்கிறோம்.
append() மு.வ.செயல்பாட்டின் நோக்கம் உங்களுக்கு நினைவிருக்கலாம். அதைக்கொண்டு பட்டியலின் இறுதியில் மட்டுமே தரவுகளை இணைக்க முடியும். ஆக, அடுக்கில் கடைசியாகத் தரவுகளைச் சேர்க்க append() பயன்படுகிறது. அடுத்ததாக அடுக்கின் கடைசி தரவினை நீக்க வேண்டும் இல்லையா? அதற்குத்தான் இருக்கவே இருக்கிறார் pop(). பட்டியலில் உள்ள கடைசி உறுப்பினை சேதாரமில்லாமல் நீக்கித் தந்திடுவார்.
இப்போது அடுக்கின் உச்சத்திலிருக்கும் தரவினை எப்படி எடுப்பீர்கள்? எதிர்மறை குறியீட்டு எண்ணைக்கொண்டு, அதாவது [-1]ஐ வைத்து. ஒரு அடுக்கு காலியாக இருக்கிறதா என்பதை எப்படிக் கண்டறியலாம்? மிக எளிது, அதன் நீளம்(len()) பூஜ்ஜியமாக இருந்தால் அதில் தரவுகள் இல்லை என்ற முடிவுக்கு வந்துவிடலாம்.
1,2,3 ஆகிய மூன்று தரவுகளையும் அடுக்கிற்கு அனுப்பி வைக்கிறோம். எனில்
3
2
1
என்ற கட்டமைப்பில் அவை சேமிக்கப்படும். while கட்டளைச் சுற்றைப் பயன்படுத்தி, அடுக்கு காலியாகும் வரைக்கும் ஒவ்வொரு தரவாக நீக்கி அதை அச்சிட்டிருக்கிறோம். இறுதியில் அடுக்கு காலியாக இருக்கிறதா என்பதை உறுதிசெய்து அதையும் பயனருக்குச் சொல்கிறோம்.
கடைபுகு-முதல்விடு என்ற த.கட்டமைப்பை ஏற்கனவே இருக்கும் பட்டியல் மற்றும் அதன் மு.வ.செயல்பாடுகளைக் கொண்டு உருவாக்கியிருக்கிறோம்.
வெளியீடு:
2) வரிசை
நிரல் 2: வரிசையை உருவாக்குதல்
அடுக்கிற்கும், வரிசைக்கும் ஒரு எளிய வேறுபாடு தான். வரிசை, முதல்வருகை முதல் வெளியேற்றம் என்கிற அடிப்படையில் செயல்படுகிறது. கிட்டத்தட்ட ஒரு மானுட வரிசையைக் கற்பனை செய்துகொள்ளுங்கள், முதலில் வருபவருக்கே முன்னுரிமை, இல்லையா? கிட்டத்தட்ட அதேதான். தரவுகள் ஒவ்வொன்றாகச் சேமிக்கப்படும், அவற்றைத் திரும்பப் பெறுகையில், எது முதலில் சேமிக்கப்பட்டதோ அதுவே முதலில் பெறப்படும். கடைபுகு-முதல்விடு, முதல்வருகை-முதல் வெளியேற்றம். இதெல்லாம் எதற்காக?
பிரிண்டரில் 5 வெவ்வேறு கோப்புகளை அச்சிடச் சொல்லி ஒரு உத்தரவைப் பிறப்பிக்கிறீர்கள், கணினி அந்த வேலையை எப்படிச் செய்ய வேண்டும்? முதலில் எந்த கோப்பு வந்ததோ அதில் தொடங்கி கடைசியில் வந்தது வரைக்கும் ஒரு வரிசையை உருவாக்க வேண்டும் இல்லையா? அதற்கு, அங்கே வரிசை த.கட்டமைப்பு பயன்படும்.
ஒரு கணித கோவை இருக்கிறது என்று வைத்துக்கொள்வோம். அதை நிரல் எப்படிப் புரிந்துகொண்டு விடை கண்டறியும்? கோவையின் இயக்கியும், மதிப்புகளும் தனித்தனியே பிரிந்து, இடப்பக்கமிருந்து கோவைக்குத் தீர்வு காணவேண்டும் அல்லவா? அங்கே அடுக்கு த.கட்டமைப்பு தேவைப்படுகிறது.
இனி நிரலுக்குத் திரும்புவோம்.
வரிசையை உருவாக்குவதற்கும் கூட பட்டியல் தான் நிரலில் பயன்படுத்தப்பட்டு இருக்கிறது. அடுக்கைப் போலவே வரிசைக்கும் நான்கு முக்கியமான இயக்கங்கள் உள்ளன.
1) enqueue, வரிசையில் தரவுகளை இணைத்தல்
2) dequeue, முதலில் இணைந்த தரவை முதலில் வெளியேற்றுதல்
3) front, முதலில் இணைந்த தரவை பெறுதல்
4) is_empty, வரிசை காலியாக உள்ளதா என்பதைக் கண்டறிதல்
இந்த இயக்கங்களைச் சாத்தியமாக்க நான்கு செயல்பாடுகளை நிரலில் உருவாக்கியிருக்கிறோம். தரவுகளை இணைக்கப் பட்டியல் தரும் அதே append() செயல்பாடு தான். அதில் மாற்றம் எதுவுமில்லை.
மிகக் கவனமாக நாம் பார்க்கவேண்டியது இணைக்கப்பட்ட தரவுகள் எப்படி மீண்டும் பெறப்படுகின்றன என்பதைத்தான். அடுக்கில் வெறுமனே pop() பயன்படுத்தியிருந்தோம், அளவுரு எதுவும் தரப்படவில்லை. ஆகவே பட்டியலில் உள்ள கடைசி உறுப்பு நீக்கப்படும். மாறாக வரிசையில் pop(0) என்று குறிப்பிடுகிறோம். இதன் அர்த்தம் என்னவென்றால், பட்டியலில்(வரிசையில்) உள்ளதில் நேர்மறை குறியீட்டு எண் 0 சுட்டும், தரவை நீக்குக என்பதாகும். இதன்மூலம் வரிசையில் முதலில் நுழைந்த தரவு முதலில் வெளியேறுகிறது. நேர்மறை குறியீட்டு எண்ணான 0ஐ பயன்படுத்தியே, வரிசையில் உள்ள முதல் தரவையும் பயனருக்குத் தெரியப்படுத்துகிறோம்.
வரிசை காலியாக உள்ளதா என்பதைக் கண்டறிய, அடுக்கில் பயன்படுத்திய அதே len() முறைதான் இங்கேயும் பின்பற்றப்படுகிறது.
1,2,3 ஆகிய தரவுகள் வரிசையில் இணைக்கப்பட்டால்
1
2
3
என்ற அடிப்படையில் அவை வெளியேறும்.
வெளியீடு:
அடுக்கு மற்றும் வரிசையின் பயன்பாடுகளையும், இன்னும் சில மேம்பட்ட த.கட்டமைப்புகளையும் வரும் அத்தியாயங்களில் பார்ப்போம்.
(தொடரும்)