Stack ဆိုတဲ့ Data structure ကို language တွေတော်တော်များများမှာ အသုံးများပါတယ်။ Java မှ မဟုတ်ပါဘူး။
Stack တွေဟာ အပေါ်ဆုံးမှာ data ကို တင်လေ့ရှိပြီး အပေါ်ဆုံးကနေပဲ ပြန်ယူတတ်ကြတယ်။ ဥပမာ method a , b , c ကို stack ပေါ်တစ်ခုချင်းစီ တင်သွားရင် ပြန်ထုတ်တဲ့အခါ c , b , a ဆိုပြီး အပေါ်ဆုံးက c က အရင် ပြီးတော့မှ b နောက်ဆုံး a ရယ်လို့ ပြန်ထွက်လာမှာပါ။
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
Stack<String> callStack = new Stack<>();
callStack.push("a()");
callStack.push("b()");
callStack.push("c()");
System.out.println("Stack Top to Bottom:");
while (!callStack.isEmpty()) {
System.out.println("Calling: " + callStack.pop());
}
}
}
သူ့ရဲ့ console output က
Stack Top to Bottom:
Calling: c()
Calling: b()
Calling: a()
Stack ကို အများဆုံးသုံတဲ့ နေရာကတော့ stack frame ပါ။
ဒါဆို Stack အကြောင်းတော့ သိသွားပြီ။ Stack frame ဆိုတာ ဘာလဲဆိုတာ ကြည့်ရအောင်။Stack Frame ဆိုတာ method တစ်ခုကို ခေါ်လိုက်တိုင်း jvm က frame တစ်ခုကို Stack ထဲတင်လိုက်တာကို ပြောတာပါ။ အလွယ်ဆုံးပြောရရင် error တက်လို့ stack trace တက်လာရင် ပြတဲ့ console output ဟာ stack frame entries တွေပါပဲ။
public class StackTraceDemo {
public static void main(String[] args) {
methodA();
}
static void methodA() {
methodB();
}
static void methodB() {
methodC();
}
static void methodC() {
int result = 10 / 0; // Will cause ArithmeticException
}
}
Error output ္ထွက်လာရင် method C က အရင်ဆုံးပြတာကိုတွေ့ရမယ်။
Exception in thread "main" java.lang.ArithmeticException: / by zero
at StackTraceDemo.methodC(StackTraceDemo.java:15)
at StackTraceDemo.methodB(StackTraceDemo.java:11)
at StackTraceDemo.methodA(StackTraceDemo.java:7)
at StackTraceDemo.main(StackTraceDemo.java:3)
Recursive function တွေမှာ တခါတလေ မှားရေးမိရင် stack frame တွေ တစ်ခုပေါ်တခုထပ်ပြီး infinite ဖြစ်သွားပါတယ်။ နောက်ဆုံးမှာ stack overflow ဖြစ်သွားတယ်ဆိုတဲ့ အကြောင်းရင်းကလည်း ဒါ့ကြောင့်ပါပဲ။
public class StackOverflowDemo {
static void recursiveCall() {
recursiveCall(); // infinite recursion
}
public static void main(String[] args) {
recursiveCall();
}
}
Error output ္ထွက်လာရင်
Exception in thread "main" java.lang.StackOverflowError
at StackOverflowDemo.recursiveCall(StackOverflowDemo.java:4)
...
ဒီလောက်ဆို Stack Data Structure နဲ့ jvm ရဲ့ stack frame အကြောင်း သဘောပေါက်လိမ့်မယ်ထင်ပါတယ်။
Top comments (0)