itajcie, zachciałem sobie ostatnio napisać taki kalkulator ONP w Javie. Polega to na tym, że np. wyrażenie: 3+(2-5)*(4/2) zamienia na onp, czyli 3 2 5 - 4 2 / * +. Potem ma to zamienić na normalną wartość.
Pierwszą część kodu programu zrobiłem, czyli zamiana na onp działa w 100%, ale mam problem z drugą częścią, a mianowicie zamianą tego na końcową wartość. Działa mi ona dla niektórych wyrażeń(np. 2 2 * +), a dla innych nie (np. 3 2 5 - 4 2 / * +). Tak wygląda ta funkcja. Byłbym wdzięczny, jeśli chcielibyście mi pomóc :)
private static void calculate(String result) {
Stack<Double> values = new Stack<>(); //stos
String str = ""; //zmienna na poszczegolna liczbe, ktora bede kladl na stos
for (int i = 0; i < result.length(); i++) {
if(result.charAt(i) == ' '){
if(result.charAt(i-1) != ' ' && result.charAt(i-1) != '+' &&//mogą być 2 spacje pod rząd
result.charAt(i-1) != '-' && result.charAt(i-1) != '*' && result.charAt(i-1) != '/'){
values.push(Double.parseDouble(str));
str = "";
}
}
else if(result.charAt(i) == '+' || result.charAt(i) == '-' ||
result.charAt(i) == '*' || result.charAt(i) == '/'){
if(result.charAt(i) == '-' && result.charAt(i+1) != ' ')
str += '-';
else{
double a = values.pop();
double b = values.pop();
switch (result.charAt(i)){
case '+':
values.push(a+b);
break;
case '-':
values.push(a-b);
break;
case '*':
values.push(a*b);
break;
case '/':
values.push(a/b);
break;
}
}
}
else {
str += result.charAt(i);
}
}
while(true){
if(values.empty())
break;
else
System.out.println(values.pop()); //tutaj taka proba wypisania na koncu
}
}