လွယ်လွယ်ပြောရရင် Stack ဆိုတာ Data တွေကို တစ်ခုပေါ် တစ်ခု ထပ်တင်ထားတဲ့ စနစ်ပါ။ အသစ်ထည့်တာ အပေါ်ဆုံးမှာပဲ ထည့်တယ်။ ပြန်ယူတဲ့အခါလည်း အပေါ်ဆုံးကဟာကိုပဲ အရင်ယူပါတယ်။ နောက်ဆုံးထည့်ထားတဲ့ဟာ အရင်ထွက်တယ်။ ဒါကို LIFO (Last In, First Out) လို့ ခေါ်ပါတယ်။
မနေ့က Queue အကြောင်း ရေးခဲ့တယ်။ Queue က တန်းစီတာပါ။ အရင်ရောက်တဲ့သူ အရင်ထွက်တယ်။ Stack က အဲဒီရဲ့ ပြောင်းပြန်ပါ။ ကျွန်တော် ဒါကို စာအုပ်ပုံနဲ့ အလွယ်မှတ်ပါတယ်။ စာအုပ်တွေကို တစ်ခုပေါ် တစ်ခု ထပ်တင်ထားတယ်ဆိုပါတော့။ အပေါ်ဆုံးက စာအုပ်ကို ယူဖို့ လွယ်ပါတယ်။ ဒါပေမယ့် အောက်ဆုံးက စာအုပ်ကို ယူချင်ရင် အပေါ်က စာအုပ်တွေအားလုံးကို အရင်ဖယ်ရတယ်။ Stack ကလည်း အဲဒီအတိုင်းပါပဲ။ အပေါ်ဆုံးကဟာနဲ့ပဲ အလုပ်လုပ်လို့ ရပါတယ်။
Stack ရဲ့ လုပ်ဆောင်ချက် ၃ ခု
Push — အပေါ်ဆုံးမှာ Data အသစ် ထည့်တာ။
Pop — အပေါ်ဆုံးက Data ကို ယူထုတ်တာ။
Peek — အပေါ်ဆုံးက Data ကို မယူဘဲ ခဏကြည့်ရုံပဲ ကြည့်တာ။
Python မှာ Stack ကို List နဲ့ အလွယ်လုပ်လို့ ရပါတယ်။
stack = []
stack.append("A") # Push A
stack.append("B") # Push B
stack.append("C") # Push C
print(stack.pop()) # C ထွက်တယ် — နောက်ဆုံးထည့်တာ အရင်ထွက်တယ်
print(stack[-1]) # Peek — အခု အပေါ်ဆုံးက B
ဒီလောက်ရိုးရှင်းတာကို ဘာလို့ သီးသန့် နာမည်ပေးရတာလဲဆိုတော့ ကွန်ပျူတာရဲ့ နေရာတော်တော်များများမှာ ဒီပုံစံအတိုင်း အလုပ်လုပ်နေလို့ပါ။
နေ့စဉ်ဘဝမှာ Stack ကို ဘယ်မှာ တွေ့နေရလဲ?
Undo (Ctrl+Z) — Word မှာ စာရိုက်တယ်၊ ဖျက်တယ်၊ ပြင်တယ်။ လုပ်ခဲ့သမျှ အလုပ်တွေကို Stack ထဲမှာ တစ်ခုပြီး တစ်ခု တင်ထားပါတယ်။ Ctrl+Z နှိပ်လိုက်တိုင်း အပေါ်ဆုံးက အလုပ်ကို Pop လုပ်ပြီး ပြန်ဖျက်ပေးပါတယ်။ အဲဒါကြောင့် Undo က နောက်ဆုံးလုပ်ခဲ့တာကနေ အစဉ်လိုက် ပြန်ဖျက်တာပါ။ Redo က ပြောင်းပြန် Stack တစ်ခု ထပ်သုံးတာပါ။
Browser Back Button — Website တွေ တစ်ခု ပြီးတစ်ခု ဖွင့်သွားတယ်။ Back နှိပ်ရင် အရင်ဆုံး ပြန်ရောက်တာက ခုနက ဖွင့်ခဲ့တဲ့ စာမျက်နှာပါ။ ဒါလည်း Stack ပါပဲ။
Function Call — Program တစ်ခုက Function A ကို ခေါ်တယ်။ A က Function B ကို ခေါ်တယ်။ B က Function C ကို ခေါ်တယ်။ C ပြီးမှ B ပြန်ရောက်တယ်၊ B ပြီးမှ A ပြန်ရောက်တယ်။ ဒါကို Call Stack လို့ ခေါ်ပါတယ်။ အရင်က Recursion အကြောင်း ရေးခဲ့တုန်းက Stack Overflow ဆိုတဲ့ Error က ဒီ Call Stack ပြည့်သွားလို့ ဖြစ်တာလို့ ပြောခဲ့ဖူးပါတယ်။
စာလုံးကွင်း စစ်တာ — (a + [b * c]) လို စာလုံးတွေမှာ ကွင်းဖွင့် ကွင်းပိတ် မှန်မမှန် စစ်တဲ့အခါ ကွင်းဖွင့်တာတွေကို Stack ထဲ ထည့်ပြီး ကွင်းပိတ်တွေ့တိုင်း အပေါ်ဆုံးနဲ့ တိုက်စစ်ပါတယ်။
Stack နဲ့ Queue ဘယ်လို ရွေးမလဲ?
နောက်ဆုံးဖြစ်ခဲ့တာကို အရင်ကိုင်တွယ်ချင်ရင် Stack သုံးပါ။ Undo, Back Button, Call Stack တွေလိုမျိုး။
အရင်လာသူကို အရင်ကိုင်တွယ်ချင်ရင် Queue သုံးပါ။ Printer တန်းစီတာ၊ Message Queue တွေလိုမျိုး။
ဒါကို မှတ်ဖို့ လွယ်ပါတယ်။ Stack က စာအုပ်ပုံ။ Queue က တန်းစီစောင့်တဲ့သူတွေ။ စာအုပ်ပုံမှာ အောက်ဆုံးစာအုပ်ကို ယူဖို့ အပေါ်က စာအုပ်တွေ ဖယ်ရသလို Stack ထဲမှာ အောက်က Data ကို ယူဖို့ အပေါ်က Data တွေ အရင် Pop လုပ်ရပါတယ်။
ကျွန်တော်တို့တွေ နေ့တိုင်း Undo နှိပ်နေတယ်၊ Back နှိပ်နေတယ်။ အဲဒီခလုတ်လေးတွေရဲ့ နောက်ကွယ်မှာ Stack ဆိုတဲ့ ရိုးရှင်းပြီး ထိရောက်တဲ့ စနစ်လေး ရှိနေတယ်ဆိုတာ သိသွားရင် ကွန်ပျူတာက ပိုရင်းနှီးလာသလို ခံစားရပါတယ်။ Data Structure ဆိုတာ ဒီလိုပါပဲ။ ခက်တဲ့ သီအိုရီ မဟုတ်ဘူး။ နေ့စဉ်ဘဝမှာ သုံးနေတဲ့ ပုံစံတွေကို နာမည်ပေးထားတာပါ။ 🙂
—