DEV Community

Zaw Htut Win
Zaw Htut Win

Posted on

အခန်း(၆) Stack and it's usage(Data Structures in Action)

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());
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

သူ့ရဲ့ console output က

Stack Top to Bottom:
Calling: c()
Calling: b()
Calling: a()
Enter fullscreen mode Exit fullscreen mode

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
    }
}
Enter fullscreen mode Exit fullscreen mode

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)

Enter fullscreen mode Exit fullscreen mode

Recursive function တွေမှာ တခါတလေ မှားရေးမိရင် stack frame တွေ တစ်ခုပေါ်တခုထပ်ပြီး infinite ဖြစ်သွားပါတယ်။ နောက်ဆုံးမှာ stack overflow ဖြစ်သွားတယ်ဆိုတဲ့ အကြောင်းရင်းကလည်း ဒါ့ကြောင့်ပါပဲ။

public class StackOverflowDemo {

    static void recursiveCall() {
        recursiveCall(); // infinite recursion
    }

    public static void main(String[] args) {
        recursiveCall();
    }
}
Enter fullscreen mode Exit fullscreen mode

Error output ္ထွက်လာရင်

Exception in thread "main" java.lang.StackOverflowError
    at StackOverflowDemo.recursiveCall(StackOverflowDemo.java:4)
    ...
Enter fullscreen mode Exit fullscreen mode

ဒီလောက်ဆို Stack Data Structure နဲ့ jvm ရဲ့ stack frame အကြောင်း သဘောပေါက်လိမ့်မယ်ထင်ပါတယ်။

Top comments (0)