تحويل تعبير بادئة إلى postfix
-
29-09-2019 - |
سؤال
أحاول تنفيذ برنامج يغير تعبير البادئة إلى 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);
}
}
لا تنتمي إلى StackOverflow