Datentypen Stack based calculator

Zukami

Mitglied
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:
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;
       
    }
 

LimDul

Top Contributor
Was ist das für eine Fehlermeldung genau? Exception? Kompiliert nicht? Unknown Source sagt mir jetzt gar nichts.

Strings solltest du übrigens nicht mit != bzw == vergleichen, sondern mit equals. In dem Beispiel dürfte es zwar gut gehen, aber sowas kann auch schnell schiefgehen.

Anstelle von peek und dann pop kannst du auch direkt den Rückgabewert von pop nehmen, das peek ist total überflüssig.
 

MoxxiManagarm

Top Contributor
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.
Der Plan klingt völlig richtig, allerdings würde ich keinen Iterator als solches nehmen, nimm einfach eine for- oder foreach-Schleife


Und zwar bekomme ich die Fehlermeldung "Source unknow" und weiss nicht wie ich den beheben kann.
Die Fehlermeldung kriege ich mit deinem code gar nicht, bei mir erscheint da eine ParseException weil versucht wird "=" zu parsen.


Du hast einen gedanklich richtigen Ansatz, aber die Umsetzung ist viel zu kompliziert gedacht. Hier ein paar spezielle Anmerkungen:
- Du vergleichst Strings aktuell mit == anstatt equals
- one und two sind verkehrt herum meine ich
- erst peek und dann pop ist redundant. mach direkt pop.
- wenn du auf ein = stößt, dann versuchst du auch 2 Elemente zu poppen, allerdings solltest du zu dem Zeitpunkt nur noch ein element haben
- Bitte vergleiche Booleans nicht als solches, b==false ist äquivalent zu !b
- Ein Stack reicht für die Aufgabe, mir ist unklar was der 2. Stack tun soll
 

MoxxiManagarm

Top Contributor
Hier mal ein quick&dirty Vorschlag, du müsstest sicher noch etwas Fehlerhandling einbauen etc.

Java:
private static Map<String, IntBinaryOperator> OPERATIONS = new HashMap<>();
static {
    OPERATIONS.put("+", Math::addExact);
    OPERATIONS.put("-", Math::subtractExact);
    OPERATIONS.put("*", Math::multiplyExact);
    OPERATIONS.put("/", Math::floorDiv);
}

public static void main( String[] arg ) {
    List<String> commands = Arrays.asList("1", "2", "3", "4", "+", "+", "+", "2", "*", "=");
    System.out.println(computeResult(commands));
}

public static int computeResult(List<String> commands) {
    Stack<Integer> stack = new Stack<>();
    for (String command : commands) {
        if (command.matches("\\d+")) {
            stack.push(Integer.valueOf(command));
        } else if (command.equals("=")) {
            return stack.pop();
        } else {
            int rightOperant = stack.pop();
            int leftOperant = stack.pop();

            stack.push(OPERATIONS.get(command).applyAsInt(leftOperant, rightOperant));
        }
    }

    return 0;
}
 

Zukami

Mitglied
Was ist das für eine Fehlermeldung genau? Exception? Kompiliert nicht? Unknown Source sagt mir jetzt gar nichts.

Strings solltest du übrigens nicht mit != bzw == vergleichen, sondern mit equals. In dem Beispiel dürfte es zwar gut gehen, aber sowas kann auch schnell schiefgehen.

Anstelle von peek und dann pop kannst du auch direkt den Rückgabewert von pop nehmen, das peek ist total überflüssig.
Java:
Exception in thread "main" java.lang.NumberFormatException: For input string: "="
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at assignement08.Solution08.computeResult(Solution08.java:51)
    at assignement08.Solution08.main(Solution08.java:24)
das hier wird mir auf de Console geschmissen...
Also irgendwie hat es probleme mit dem parseInt...
 

Zukami

Mitglied
Der Plan klingt völlig richtig, allerdings würde ich keinen Iterator als solches nehmen, nimm einfach eine for- oder foreach-Schleife



Die Fehlermeldung kriege ich mit deinem code gar nicht, bei mir erscheint da eine ParseException weil versucht wird "=" zu parsen.


Du hast einen gedanklich richtigen Ansatz, aber die Umsetzung ist viel zu kompliziert gedacht. Hier ein paar spezielle Anmerkungen:
- Du vergleichst Strings aktuell mit == anstatt equals
- one und two sind verkehrt herum meine ich
- erst peek und dann pop ist redundant. mach direkt pop.
- wenn du auf ein = stößt, dann versuchst du auch 2 Elemente zu poppen, allerdings solltest du zu dem Zeitpunkt nur noch ein element haben
- Bitte vergleiche Booleans nicht als solches, b==false ist äquivalent zu !b
- Ein Stack reicht für die Aufgabe, mir ist unklar was der 2. Stack tun soll

Vielen Dank für deine Tipps! :)

- Die Verwendung eines Iterators wurde uns leider vorgeschrieben...
- das mit dem vergleich werde ich gleich fixxen
- achsoo wusste nicht, dass ich direkt pop machen kann cool :)
- ich habe zwei stacks verwendet, weil ich mir folgendes überlegt habe:
Liste ("1", "2", "3", "4", "+", "+", "+", "2", "*", "=");
wenn ich jetzt alle Zahlen auf einen Stack schmeisse, dann hätte ich ja dann die 1 zu unterst ich möchte sie aber zu oberst haben. Deshalb habe ich es zuerst, in den einen Stack in umgekehrter Reihenfolge gespeichert, um von dem dann immer das oberste element als unterstes im zweiten stack zu speichern

Ich hab nen Fehler gefunden und zwar hatte ich in der ersten while schleife lauter || Oder anstatt &&...
Jetzt funktioniert der Code , aber ich bekomme als output 0.
Habe nun einen neuen Iterator gesetzt, damit die schleife auch wirklich betreten wird nun habe ich wieder ne fehlermeldung und zwar
eine empty stack exception, der sollte aber gar nicht leer sein, oder habe ich weiter oben im code noch irgend ein fehler?
 
Zuletzt bearbeitet:

LimDul

Top Contributor
Das ist nicht Unkown Source als Fehler - sondern eine NumberFormatException. Er versucht den String "=" als Zahl zu parsen, was offensichtlich nicht geht. Die relevante Zeile ist die, wo dein Source Code erwähnt wird - Zeile 51.

Ursache dürfte dann doch der Vergleich der Strings mit != bzw == sein. Mach da mal ein equals draus.
 

Zukami

Mitglied
Das ist nicht Unkown Source als Fehler - sondern eine NumberFormatException. Er versucht den String "=" als Zahl zu parsen, was offensichtlich nicht geht. Die relevante Zeile ist die, wo dein Source Code erwähnt wird - Zeile 51.

Ursache dürfte dann doch der Vergleich der Strings mit != bzw == sein. Mach da mal ein equals draus.

Ich habe den Fehler gerade gefunden und zwar in der ersten while schleife habe ic blöderweise || anstatt && gemacht ... 🤦‍♀️
 

Zukami

Mitglied
Vielen Dank für deine Tipps! :)

- Die Verwendung eines Iterators wurde uns leider vorgeschrieben...
- das mit dem vergleich werde ich gleich fixxen
- achsoo wusste nicht, dass ich direkt pop machen kann cool :)
- ich habe zwei stacks verwendet, weil ich mir folgendes überlegt habe:
Liste ("1", "2", "3", "4", "+", "+", "+", "2", "*", "=");
wenn ich jetzt alle Zahlen auf einen Stack schmeisse, dann hätte ich ja dann die 1 zu unterst ich möchte sie aber zu oberst haben. Deshalb habe ich es zuerst, in den einen Stack in umgekehrter Reihenfolge gespeichert, um von dem dann immer das oberste element als unterstes im zweiten stack zu speichern

Ich hab nen Fehler gefunden und zwar hatte ich in der ersten while schleife lauter || Oder anstatt &&...
Jetzt funktioniert der Code , aber ich bekomme als output 0.
Habe nun einen neuen Iterator gesetzt, damit die schleife auch wirklich betreten wird nun habe ich wieder ne fehlermeldung und zwar
eine empty stack exception, der sollte aber gar nicht leer sein, oder habe ich weiter oben im code noch irgend ein fehler?
hab den fehler gefunden und bearbeite ihn gerade hab das mit dem = und dem doppelten popen vergessen zu verbessern ^^

UPDATE:
Es funktioniert nun :)
Vielen Dank für die Hilfe :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A stack Java Basics - Anfänger-Themen 14
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
V Ist Off-Heap-Speicher dasselbe wie Stack-Speicher? Java Basics - Anfänger-Themen 2
izoards Stack... Java Basics - Anfänger-Themen 17
Csircc Rekursive Methode Stack Overflow Java Basics - Anfänger-Themen 10
B Zahlenfolge von Queue in Stack Java Basics - Anfänger-Themen 29
L Stack bilden, push und pop Java Basics - Anfänger-Themen 16
KogoroMori21 Stack und Heap Speicher Java Basics - Anfänger-Themen 1
G Stack und Queue Arbeitsblatt Java Basics - Anfänger-Themen 3
G Stack programmieren Java Basics - Anfänger-Themen 6
F speicherort stack oder heap Java Basics - Anfänger-Themen 1
S Rekursiven Stack Java Basics - Anfänger-Themen 6
Curtis_MC Collections Zufälliges Element aus Stack Java Basics - Anfänger-Themen 2
D Queue vs. Stack Java Basics - Anfänger-Themen 6
P Stack, Heap Java Basics - Anfänger-Themen 13
D Erste Schritte Stack im Rollenspiel Java Basics - Anfänger-Themen 76
J Stack mit Benutzereingabe Java Basics - Anfänger-Themen 17
J Liste,Queue,Stack sortieren Java Basics - Anfänger-Themen 2
C Stack und Queue in Aktion (Bitte Hilfe für die Klausur) Java Basics - Anfänger-Themen 7
S Sequenz von Zahlen bei einem Stack möglich oder nicht möglich? Java Basics - Anfänger-Themen 5
E Stack vs Queue - Gemeinsamkeiten / Unterschiede Java Basics - Anfänger-Themen 7
C Laufzeit von Stack Operation Java Basics - Anfänger-Themen 5
4 Stack over flow bei rekursiver Tiefensuche Java Basics - Anfänger-Themen 5
J Quicksort mit Stack Java Basics - Anfänger-Themen 4
A Anzahl der Elemente in einem Stack wiedergeben Java Basics - Anfänger-Themen 3
T Stack Overflow - Rekursive Fibonacci Java Basics - Anfänger-Themen 10
K Tiefen- und Breitensuche beim Baum durch Stack und Warteschlange Java Basics - Anfänger-Themen 1
L Liste mittels Stack implementieren Java Basics - Anfänger-Themen 0
A Stack programmieren -> Unklarheiten Java Basics - Anfänger-Themen 1
C Stack - listenbasierte Implementierung Java Basics - Anfänger-Themen 4
L Mit rekursiven Aufrufen einen Stack emulieren Java Basics - Anfänger-Themen 1
T Frage zu Java Stack Java Basics - Anfänger-Themen 5
D Stack-Objekt - LIFO - wait(); notify(); Java Basics - Anfänger-Themen 0
J Array von Objekten, wie schauts im Heap / Stack aus ? Java Basics - Anfänger-Themen 7
M Frage zu Stack und Heap Java Basics - Anfänger-Themen 1
Farbenfroh Suche Übungsaufgaben: BinaryTree, Stack Java Basics - Anfänger-Themen 0
D Aufgabe: Stack mit Iterator Java Basics - Anfänger-Themen 8
X Stack mit Oberklasse, wieso funktioniert es nicht? Java Basics - Anfänger-Themen 8
B Stack/Heap Frage Java Basics - Anfänger-Themen 36
K Probleme mit stack Java Basics - Anfänger-Themen 7
K Wofür wird heute noch die Stack Klasse in Java genutzt Java Basics - Anfänger-Themen 4
F Rekursion Tiefensuch-Problem - Stack Overflow Java Basics - Anfänger-Themen 9
P LinkedList - Stack ... grundlegende Frage Java Basics - Anfänger-Themen 5
B Stack in eine verkettete Liste pushen Java Basics - Anfänger-Themen 4
J OOP Warum braucht man den Stack Java Basics - Anfänger-Themen 3
B Queue mit Daten aus einem Stack füllen Java Basics - Anfänger-Themen 21
G Stack invertieren Java Basics - Anfänger-Themen 3
H Pseudo-Stack (char[] stackArray) mit Zeichen aus einer .txt-Datei befüllen Java Basics - Anfänger-Themen 5
S Stack Problem mit Objekt Java Basics - Anfänger-Themen 2
X String mit String von Objekt im Stack vergleichen? Java Basics - Anfänger-Themen 14
D Stack auslesen mit pop Java Basics - Anfänger-Themen 2
S Stack als verkettete liste/ toString methode Java Basics - Anfänger-Themen 3
S Exceptions bei push/pop in Stack Java Basics - Anfänger-Themen 8
S Eigene Stack Klasse Java Basics - Anfänger-Themen 26
S Stack: Klasseninvariante Java Basics - Anfänger-Themen 4
L OOP Wrapper Klassen - Stack-Aufgabe Java Basics - Anfänger-Themen 2
M Frage zu Stack Java Basics - Anfänger-Themen 3
D Problem mit Set, Stack und Random Java Basics - Anfänger-Themen 2
O Stack Implementierung als verkettete Liste Java Basics - Anfänger-Themen 8
T Probleme bei einen Stack der über drei Dateien funktionieren soll Java Basics - Anfänger-Themen 5
V java.util.Stack Java Basics - Anfänger-Themen 9
K Stack und immer gleiches Objekt Java Basics - Anfänger-Themen 11
kulturfenster Stack / Queue Implementationen Java Basics - Anfänger-Themen 11
S Stack einlesen. Java Basics - Anfänger-Themen 2
E Stack kann nicht implimentiert werden Java Basics - Anfänger-Themen 11
E Eigene Stack Klasse schreiben Java Basics - Anfänger-Themen 12
J Stack Java Basics - Anfänger-Themen 3
K min-int-Wert in'nem Stack Java Basics - Anfänger-Themen 8
L Stack UpnRechner Java Basics - Anfänger-Themen 4
B Stack mit Bildern füllen Java Basics - Anfänger-Themen 2
B Stack mit Strings in zufälliger Reihenfolge füllen Java Basics - Anfänger-Themen 4
J Stack, der Integer-Zahlen enthält Java Basics - Anfänger-Themen 3
K Array Stack Java Basics - Anfänger-Themen 6
O Stack-Klasse Java Basics - Anfänger-Themen 7
S Stack mit Arrays Java Basics - Anfänger-Themen 3
T generischer stack Java Basics - Anfänger-Themen 3
Z Keller/Stack Problem Java Basics - Anfänger-Themen 11
H Stack und Queue Java Basics - Anfänger-Themen 6
M Stack SetValTop Java Basics - Anfänger-Themen 6
G Die Klasse Stack selber schreiben. Java Basics - Anfänger-Themen 2
F Klammertest mit Stack implementieren Java Basics - Anfänger-Themen 5
X Stack Java Basics - Anfänger-Themen 14
J Morgen Java-Klausur. Stack, Heap, Method-Area Java Basics - Anfänger-Themen 2
H Unterschied zwischen Stack und Array Java Basics - Anfänger-Themen 3
F MergeSort iterativ mit Hilfe von Stack Java Basics - Anfänger-Themen 5
S stack Java Basics - Anfänger-Themen 3
S Stack invertieren Java Basics - Anfänger-Themen 14
S Stack-Operationen Java Basics - Anfänger-Themen 59
S Stack.pop() wie genau funktioniert das? Java Basics - Anfänger-Themen 3
A Stack, Frage zur Methode push Java Basics - Anfänger-Themen 4
C Anzahl der Elemente auf einem Stack Java Basics - Anfänger-Themen 4
D Stack chaos Java Basics - Anfänger-Themen 2
megachucky kleines problem mit nem STACK Java Basics - Anfänger-Themen 8
I Stack ist auf einmal empty Java Basics - Anfänger-Themen 3
R Beispiele für Stack & Visualisierung Java Basics - Anfänger-Themen 2
R Stack: Wieso funktioiert das? Java Basics - Anfänger-Themen 2
B eine kleine leichte aufgabe mit einem stack programmieren Java Basics - Anfänger-Themen 2
N Stack-Probleme Java Basics - Anfänger-Themen 2
K Stack Overflow Java Basics - Anfänger-Themen 2
G Tomcat Form-based Authentifizierung Java Basics - Anfänger-Themen 0

Ähnliche Java Themen

Neue Themen


Oben