يعمل حساب Postfix فقط مع التباعد المناسب (أي3 14 2*7/ يطرح استثناء)
-
21-12-2019 - |
سؤال
يعمل الكود المنشور للعمليات ولكنه لن يعمل إذا لم يكن هناك تباعد بين عوامل التشغيل والمعاملات.
لقد أعطيت 4 تعبيرات لحسابها
10 2 8 * + 3 -
3 14+2*7/
4 2 + 3 15 1 - * +
1 2 + 3 % 6 - 2 3 + /
(التباعد مهم)
التعبير الثاني هو الذي لن يتم حسابه باستخدام الآلة الحاسبة الحالية
هنا هو الكود الخاص بي
import java.util.*;
public class PostFix {
public static void main(String []args){
Stack<Integer> stack = new Stack<Integer>();
System.out.println("Input your expression using postfix notation");
Scanner input = new Scanner(System.in);
String expr = input.nextLine();
StringTokenizer tokenizer = new StringTokenizer(expr);
while(tokenizer.hasMoreTokens()){
String c = tokenizer.nextToken();
if(c.startsWith("0")|| c.startsWith("1")||c.startsWith("2")||c.startsWith("3")||c.startsWith("4")||
c.startsWith("5")||c.startsWith("6")||c.startsWith("7")||c.startsWith("8")||c.startsWith("9"))
stack.push(Integer.parseInt(c));
else if(c.equals("+")){
int op1 = stack.pop();
int op2= stack.pop();
stack.push(op2+op1);
}
else if(c.equals("-")){
int op1 = stack.pop();
int op2= stack.pop();
stack.push(op2-op1);
}
else if(c.equals("*")){
int op1 = stack.pop();
int op2= stack.pop();
stack.push(op2*op1);
}
else if(c.equals("/")){
int op1 = stack.pop();
int op2= stack.pop();
stack.push(op2/op1);
}
else if(c.equals("%")){
int op1 = stack.pop();
int op2= stack.pop();
stack.push(op1%op2);
}
}
System.out.println(stack.pop());
}
}
هنا StackTrace
Input your expression using postfix notation
3 14+2*7/
Exception in thread "main" java.lang.NumberFormatException: For input string: "14+2*7/"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at PostFix.main(PostFix.java:18)
المحلول
إذا كان عليك حقا أن تستخدم StringTokenizer
, ، قم ببنائها هكذا:
StringTokenizer tokenizer = new StringTokenizer(expr, " +-*/%", true);
تقول المعلمة الثانية أن المسافات وجميع العوامل تعتبر محددات، بالإضافة إلى المسافات.تقول المعلمة الثالثة أن المحددات يتم التعامل معها كرموز مميزة، وذلك عندما تراها "+"
, "-"
, وما إلى ذلك، سيعيد ذلك كسلسلة.سيُرجع أيضًا مسافات، لذا عليك التأكد من ذلك متى nextToken
عائدات " "
, ، تتجاهله ولا تتعامل معه على أنه خطأ.
نصائح أخرى
بدلا من ذلك، إذا لم تتمكن من استخدام Streamtokenizer، فاستخدم إصدار 3 وسيطة من منشئ StrindTOknizer:
giveacodicetagpre.هذا سيجعل "،" + "،" * "،" - "و" "و" / "، وأبلغوا أيضا عن الرموز.
استخدم Streamtokenizer لتحليله، راجع http://docs.oracle.com/javase/7/docs/api/java/io/streamtokenizer.html
giveacodicetagpre.