سؤال

أحاول تنفيذ برنامج يغير تعبير البادئة إلى Postfix One باستخدام التكرار.

لقد كتبت ما اعتقدت أنه سيعمل ولكن بدلاً من الإخراج ab/c*de+f*- انا حصلت aa/aa/*aa/aa/*- في حين أن.

أعتقد أن رمزتي تتعثر عندما أحاول الحصول على الشخصية الأولى String pre أو عندما أحاول حذف الشخصية الأولى String pre. أي اقتراحات/تعليقات؟

  public class Prefix2Postfix {
        public static final String prefixInput ="-*/abc*+def";
        //desired postfix output is "ab/c*de+f*-"

        public static void main (String[] args){
            System.out.println(pre2Post(prefixInput));
        }

        public static String pre2Post(String pre){
            //find length of string
            int length = pre.length();

            //ch = first character of pre
            char ch = pre.charAt(0);

            //delete first character of pre
            pre = pre.substring(1,length);
            if(Character.isLetter(ch)){
                //base case: single identifier expression
                return (new Character(ch)).toString(ch);
            }else{ 
                //ch is an operator
                String postfix1 = pre2Post(pre);
                String postfix2 = pre2Post(pre);
                return postfix1 + postfix2 + ch;
            }
        }
    }
هل كانت مفيدة؟

المحلول

لذا فإن الخطأ في الكود الخاص بك يتعلق بالمكان الذي تحسب فيه postfix1 و postfix2 - لاحظ أنك لا تعوض postfix2.

للقيام بهذا التكرار ، تحتاج إلى فهم بعض الحالات:

  • عندما تواجه مشغلًا ، تحتاج إلى إعادة تكرار المشغل ونقله إلى اليمين ، ثم معالجة أي جزء متبقي من السلسلة لم تتم معالجته
  • عندما تواجه خطابًا ومشغلًا ، يجب عليك فقط إعادة الرسالة
  • عندما تواجه رسالتين ، يجب عليك فقط إعادة هاتين الحرفين

هذا يعني عندما تواجه شيئًا مثل +-abc سوف تفعل الخطوات التالية:

f("+-abc") => return f("-abc") + "+" + f(rem1)
 f("-abc") => return f("abc") + "-" + f(rem2)
  f("abc") => return "ab"
  rem2 = "c" (remainder of the string)
  f("c")   => return "c"
 rem1 = ""   (nothing left in the string to parse)

which constructs "ab-c+"

هذا يجب أن يعمل:

public static String pre2post(String pre){
    if(pre.length() <= 1){
        return pre;
    }

    if(!Character.isLetter(pre.charAt(0))){
        String a = pre2post(pre.substring(1)) + pre.charAt(0);
        String b = pre2post(pre.substring(a.length()));
        return a + b;
    }else if(!Character.isLetter(pre.charAt(1))){
        return pre.substring(0,1);
    }else{
        return pre.substring(0,2);
    }

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top