Проверить, является ли элемент в стеке числом или оператором?
Я пытаюсь создать калькулятор RPN с помощью сканера. Я собираю числа и операторы от пользователя и объединяю входные данные в строку под названием results
, Как только они выходят (говоря "Q" или "Q"), я хотел бы передать results
к методу evaluateResults
, который будет выполнять операции, которые они ввели. Например, если строка передана evaluateResults
"45+", я хотел бы добавить 4 и 5. Однако, если вход "456+ х", я хотел бы выполнить (4 + 5) х 6', то есть я читаю строку до символ является оператором, затем я выполняю этот оператор с первыми двумя числовыми символами строки... Я пытаюсь сделать это с помощью следующей программы:
import java.util.*;
/**
This calculator uses the reverse Polish notation.
*/
public class P15_7 {
public static void evaluateResult(String inp){
int output = 0;
Stack<Integer> results = new Stack<>();
for (int i = 0; i < inp.length(); i++){
char c = inp.charAt(i);
if (Character.isDigit(c)){
results.push(Character.getNumericValue(c));
}else{
Iterator<Integer> itr = results.iterator();
while(itr.hasNext()){
if (c == '+'){
int f = itr.next(); // Getting the First value of the Stack
itr.remove(); // Removing it (first val)
int s = itr.next(); // Getting the Second value of the Stack
itr.remove(); // Removing it (second val)
output = output + (f + s);// calculate
itr = results.iterator(); // Starting the iterator back at Index 0
itr.add(output); // Adding the calculated value at the start : Index 0
}else if (c == '-'){
int f = itr.next();
itr.remove();
int s = itr.next();
itr.remove();
output = output + (f - s);
itr = results.iterator();
itr.add(output);
}else if (c == '*' || c == 'x'){
int f = itr.next();
itr.remove();
int s = itr.next();
itr.remove();
output = output + (f * s);
itr = results.iterator();
itr.add(output);
}else if (c == '/'){
int f = itr.next();
itr.remove();
int s = itr.next();
itr.remove();
output = output + (f / s);
itr = results.iterator();
itr.add(output);
}
}
}
}
System.out.println("You answer is: " + output);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String results = "";
System.out.println("Enter one number or operator per line, Q to quit. ");
boolean done = false;
while(!done){
String input = in.nextLine();
if(input.equals("Q") || input.equals("q")){
evaluateResult(results);
done = true;
}else{
results = results.concat(input);
System.out.println(results);
}
}
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить инт output
добавить в начало стека с использованием итератора. Как я могу изменить этот код для выполнения метода, как я описал его выше? Любые изменения будут полезны, и, пожалуйста, дайте мне знать, если мне что-то неясно, и я уточню.
1 ответ
Вот основной процесс интерпретации RPN, описанный в псевдокоде:
while (more input available)
{
get next input synbol S
if (S is a number)
push S on the Stack
else // S must be an operator
{
pop the top item from Stack into op2
pop the (new) top item from Stack into op1
compute the result R by performing the operation named by S
on op1 and op2
push R on the stack
}
}
pop the final result from the Stack