Hallo zusammen,
ich habe die Aufgabe einen stack based calculator zu implementieren.
Gegeben dabei ist eine Liste aus Strings die Zahlen und Operatoren enthält. ("+", "-", "4" etc.)
Beispielsweise sollte aus der liste ("1","2", "3", "4", "+", "+", "+","2", "*", "=")
folgendes berechnet werden: (1+2+3+4) *2 == 20
Mein Plan war folgender:
1. Alle "Zahlen" aus der Liste in helpStack speichern ( von unten nach oben : 1,2,3,4,2)
2. Alle "Zahlen" aus helpStack in dataStack als integer speichern ( von unten nach oben: 2,4,3,2,1)
3. Mit Iterator die Liste durchgehen, wenn man auf einen Operator stösst die ersten beiden Elemente von dem stack nehmen, auf diese den Operator anwenden und das daraus berechnete element wieder auf den Stack legen.
So viel zu meinem Plan, denn ich auch mal implementiert habe aber noch nicht ganz funktioniert.
Und zwar bekomme ich die Fehlermeldung "Source unknow" und weiss nicht wie ich den beheben kann.
Zudem habe ich mich auch gefragt, da mein code relativ lange ist, ob das nicht auch kürzer bzw mit einem direkteren Weg gehen könnte
Vielen Dank schon einmal für Eure Hilfe.
Hier ist mein Code:
ich habe die Aufgabe einen stack based calculator zu implementieren.
Gegeben dabei ist eine Liste aus Strings die Zahlen und Operatoren enthält. ("+", "-", "4" etc.)
Beispielsweise sollte aus der liste ("1","2", "3", "4", "+", "+", "+","2", "*", "=")
folgendes berechnet werden: (1+2+3+4) *2 == 20
Mein Plan war folgender:
1. Alle "Zahlen" aus der Liste in helpStack speichern ( von unten nach oben : 1,2,3,4,2)
2. Alle "Zahlen" aus helpStack in dataStack als integer speichern ( von unten nach oben: 2,4,3,2,1)
3. Mit Iterator die Liste durchgehen, wenn man auf einen Operator stösst die ersten beiden Elemente von dem stack nehmen, auf diese den Operator anwenden und das daraus berechnete element wieder auf den Stack legen.
So viel zu meinem Plan, denn ich auch mal implementiert habe aber noch nicht ganz funktioniert.
Und zwar bekomme ich die Fehlermeldung "Source unknow" und weiss nicht wie ich den beheben kann.
Zudem habe ich mich auch gefragt, da mein code relativ lange ist, ob das nicht auch kürzer bzw mit einem direkteren Weg gehen könnte
Vielen Dank schon einmal für Eure Hilfe.
Hier ist mein Code:
Java:
public static void main( String[] arg ) {
ArrayList<String> commands = new ArrayList<String>();
commands.add("1");
commands.add("2");
commands.add("3");
commands.add("4");
commands.add("+");
commands.add("+");
commands.add("+");
commands.add("2");
commands.add("*");
commands.add("=");
//System.out.println(commands.toString());
System.out.println(computeResult(commands));
}
/**
* Methode um zahlen und operatoren einer Liste zu verwenden und berechnen
* @param commands Liste mit Zahlen und Operatoren
* @return berechnete zahl
*/
public static int computeResult(ArrayList<String> commands) {
Stack<Integer> dataStack = new Stack <Integer>();
Stack<String> helpStack= new Stack <String>();
Iterator<String> iter = commands.iterator();
// Alle Zahlen von der Liste werden auf einen Stack gelegt
while(iter.hasNext()) {
String x;
x = iter.next();
if ( x!= "+" || x != "-" || x!= "/" || x!="*" || x!= "=")
helpStack.push(x);
}
// Die Zahlen des helpStack werden in dataStack gespeichert
// DataStack hat jetzt eine umgekehrte Reihenfolge als helpStack
while (helpStack.isEmpty()== false) {
int i = Integer.parseInt(helpStack.peek()); // Fehlermeldung: Unknown Source
dataStack.push(i);
helpStack.pop();
}
// Die Liste wird durchgegangen und wenn ein Operator auftaucht,
// werden die ersten beiden Elemente von dem Stack entfernt und mit dem jeweiligen Operator berechnet
// Das Ergebnis davon wird dann wieder auf den Stack gelegt
// Das erste Element des Iterators wird gelöscht und das ganze wieder neu durchgeführt
while(iter.hasNext()) {
String k;
k = iter.next();
int neu;
if ( k== "+" || k == "-" || k== "/" || k=="*" || k== "=") {
int one = dataStack.peek();
dataStack.pop();
int two = dataStack.peek();
dataStack.pop();
if (k =="+") {
neu = one + two;
dataStack.push(neu);
}
if (k=="-") {
neu = one - two;
dataStack.push(neu);
}
if (k=="/") {
neu = one / two;
dataStack.push(neu);
}
if (k=="*") {
neu = one * two;
dataStack.push(neu);
}
if (k=="=") {
neu = dataStack.peek();
return neu;
}
iter.remove();
}
else {
iter.remove();
}
}
return 0;
}