المكدس عبارة عن قائمة تقيد الإدراج والحذف المطلوب تنفيذها فقط في وضع واحد. هذا الموقف هو نهاية القائمة ، تسمى الجزء العلوي من المكدس. للعمليات الأساسية للمكدس ، هناك دفع وبوب. السابق هو الإدراج والأخير حذف.
المكدس هو أيضا جدول FIFO.
هناك نوعان من تطبيقات المداخن ، أحدهما لاستخدام المصفوفات والآخر هو استخدام القوائم المرتبطة.
الفئة العامة myArrayStack <e> {private ArrayList <e> list = new ArrayList <> () ؛ Public void push (e e) {list.add (e) ؛ } publ e pop () {return list.remove (list.size () - 1) ؛ } Public e PeEK () {return list.get (list.size () - 1) ؛ } boolean public isEmpty () {return list.size () == 0 ؛ }} الفئة العامة myLinkStack <e> {LinkedList <e> list = new LinkedList <> () ؛ public void push (e e) {list.addlast (e) ؛ } publ e pop () {return list.removelast () ؛ } Public E PEEK () {return list.getLast () ؛ } boolean public isEmpty () {return list.size () == 0 ؛ }} تطبيق المكدس
رمز التوازن
بالنظر إلى سلسلة من التعليمات البرمجية ، نتحقق مما إذا كانت الأقواس الموجودة في هذا الرمز تتوافق مع بناء الجملة.
على سبيل المثال: [{()}] هذا قانوني ، ولكن [{]} () غير قانوني.
ما يلي هو رمز الاختبار:
الفئة العامة BADANCESYMBOL {Public Boolean Isbalance (String string) {MyArrayStack <Chirph> stack = new MyArrayStack <> () ؛ char [] array = string.tochararray () ؛ لـ (char ch: array) {if ("{[(" .Indexof (ch)> = 0) {stack.push (ch) ؛} else elf ("}])". indexof (ch)> = 0) {if (isMatching (stack.peek () ، ch) {stack.pop () ؛ }}} return stack.isempty () ؛ } private boolean isMatching (char peek ، char ch) {if ((peek == '{' && ch == '}') || (peek == '[' && ch == ']') || (peek == '(' && ch == ')) {return true ؛ } إرجاع خطأ ؛ } main static void main (string [] args) {paricensymbol symbol = new BaricencyMbol () ؛ String string = "Public Static Void Main (String [] args) {badicsymbol symbol = new Barinicsymbol () ؛}" ؛ String String2 = "Public Static Void Main (String [] args) {BarinancyMbol Symbol = new Badicsymbol ([) ؛}]" ؛ system.out.println (symbor.isbalance (string)) ؛ system.out.println (symbor.isbalance (string2)) ؛ }} تعبير لاحقة
على سبيل المثال ، يحسب الإدخال التالي النتيجة المقابلة ،
3 + 2 + 3 * 2 =؟
سيؤدي ذلك إلى نتائج مختلفة في ترتيب حساب مختلف. إذا كانت نتيجة الحساب هي 16 من اليسار إلى اليمين ، وإذا كانت نتيجة الحساب هي 11 وفقًا للأولوية الرياضية.
إذا تم تحويل تعبير Infix أعلاه إلى تعبير لاحقة:
3 2 + 3 2 * +
سيكون من السهل جدًا حساب قيمة هذا التعبير باستخدام تعبير لاحقة ، ما عليك سوى استخدام مكدس.
كلما تمت مواجهة رقم ، ضع الرقم على المكدس.
كلما تمت مواجهة المشغل ، يطفو عنصرين على حسابه وفقًا للمشغل ثم وضعهما على المكدس.
العنصر الوحيد الذي ينبثق المكدس هو نتيجة الحساب.
/*** نسخة مبسطة ، كل معامل هو واحد فقط ، وافتراض أن السلسلة قانونية*/فئة عامة postfixexpression {public static int calculate (سلسلة السلسلة) {myArrayStack <string> stack = new MyArrayStack <> () ؛ char [] arr = string.tochararray () ؛ لـ (char ch: arr) {if ("0123456789" .indexof (ch)> = 0) {stack.push (ch + "") ؛ } آخر إذا ("+-*/". indexof (ch)> = 0) {int a = integer.parseint (stack.pop ()) ؛ int b = integer.parseint (stack.pop ()) ؛ if (ch == ' +') {stack.push ((a + b) + "") ؛ } آخر إذا (ch == ' -') {stack.push ((a - b) + "") ؛ } آخر إذا (ch == ' *') {stack.push ((a * b) + "") ؛ } آخر إذا (ch == ' /') {stack.push ((a / b) + "") ؛ }} return integer.parseint (stack.peek ()) ؛ } public static void main (string [] args) {system.out.println (حساب ("32+32*+") ؛ }} تحويل تعبير Infix إلى تعبير لاحقة
لنفترض فقط التعبيرات +، -، *، /، () يتم تشغيلها. والتعبير قانوني.
A + B * C - (D * E + F) / G تعبير اللاحقة المحولة كما يلي:
ABC * + DE * F + G / -
الخطوات اللازمة لاستخدام مكدس infix لتحويل اللواحق هي كما يلي:
استيراد java.util.hashmap ؛ استيراد java.util.map ؛ تعبيرات الفئة العامة {خريطة ثابتة خاصة <faracter ، integer> map = new hashmap <الحرف ، integer> () ؛ ثابت {map.put ('+' ، 0) ؛ map.put ('-' ، 1) ؛ map.put ('*' ، 2) ؛ map.put ('/' ، 3) ؛ map.put ('(' ، 4) ؛} char static char static [] [] [] [] = {// الحالي المشغل // + - */(/ * stack + */{'> ،'> ، '<' ، '<' ، <'} ،/ * top- */{' '>' ، '<'} ،/ * make/ */{'>' ، '>' ، '>' ، '>' ، '<'} ،/ * character ( */{'<' ، '<' ، '<' ، '<' ، <'} ،} ؛ switch static switch1 (String string) {StringBuilder builder = new myArrayStack <Charter> stack = new MyArrayStack <> () ؛ == ch) {بينما (true &&! stack.isempty ()) {char tmp = stack.pop () ؛ (ispriorityhigh (tmp ، ch) {builder.append (stack.pop ()) ؛ } return builder.toString () ؛ } private static boolean ispriorityhigh (char tmp ، char ch) {return priority [map.get (tmp)] [map.get (ch)] == '>' ؛ } public static void main (string [] args) {system.out.println (switch1 ("a+b*c- (d*e+f)/g")) ؛ }}من خلال هذه المقالة ، آمل أن يتقن الجميع معرفة Java Stack. شكرا لدعمكم لهذا الموقع!