Linked List schreiben und lesen

Status
Nicht offen für weitere Antworten.

Marcus

Mitglied
Hallo

Ich habe hier ein Problem mit meinem Programm das eine Formel mit Klammern lesen und ausrechnen soll. Die Formel muss mit Klammern eingeben werden und darf bislang nur einstellige Zahlen haben. Ich schreibe dann die Operatoren oder Ziffern in eine Linked List rein. Wenn ein ) kommt beginne ich mit der Rechnung und mache so weiter bis zum Ende wo dann das Ergebniss ausgeben wird.
Nur beim Auslesen meiner Linked List passt irgendwas nicht. Vielleicht kann mir jemand helfen. Ich bin schon seit einigen Tagen dabei und komme nicht weiter.

Gruss Marcus

Hier mein Quellcode
Code:
import java.lang.*;
import java.util.*;
import java.io.*;
class assignment1a
{
public static void main (String args[])
   {
   int length, test;
   float number=0;
   boolean checking;
   char input;
   KeyboardInput in = new KeyboardInput();

   FloatNode Number=null;
   FloatNode numLink=null;
   FloatNode FloatNode=null;
   CharNode Operator=null;
   
   System.out.println("Enter a fully parenthesised arithmetic expression: ");
   String s = in.readString();				//reading in a string from the keyboard
   length = s.length();                                 //getting the lenght of the input string

   check expression = new check(s);
   check evaluate = new check();
       if (expression.Letter() == false) 
            {
                    System.out.println("Invalid arithmetic expression!");
                    System.exit(0);
            }
       else
                    System.out.println("Valid arithmetic expression.");

   for (int i = 0 ; i < length ; i ++)
   {
        input = s.charAt(i);
            if (input == '(')
                continue;
        
            else if (input == ')')
                {
                System.out.println("Operator ) ");
                calculate();
                continue;
                }

            else if (input == '+')
                {
                System.out.println("Operator + ");
                Operator = new CharNode ('+' , Operator);
                continue;
                }

            else if (input == '-')
                {
                System.out.println("Operator - ");
                Operator = new CharNode ('-' , Operator);
                continue;
                }
            
            else if (input == '/')
                {
                System.out.println("Operator / ");
                Operator = new CharNode ('/' , Operator);
                continue;
                }
   
            else if (input == '*')
                {
                System.out.println("Operator * ");
                Operator = new CharNode ('*' , Operator);
                continue;
                }
            else
                {
                FloatNode newFloat = new FloatNode(number, FloatNode);
                System.out.println("Number");
                }
   }
   
   //print the solution 
   //it is the last entry in the linked list
   System.out.println("The result is : " + FloatNode.getData());
}
public static void calculate()
        {
        float result = 0;

   	char Operator;
	FloatNode Number=null;
        FloatNode numLink=null;
        FloatNode FloatNode=null;
        //CharNode Operator=null;
        
        System.out.println("This is the calculate method.");
        //pop the Operator stack and store it in the char operator value
	CharNode test = new CharNode();
        char op = test.getData();
        CharNode newOp = test.getLink();

        //pop the FloatNode stack and store it in the float number2 value
        float number2 = FloatNode.getData();
        FloatNode = FloatNode.getLink();

        
        //pop the FloatNode stack and store it in the float number1 value
        float number1 = FloatNode.getData();
        FloatNode  = FloatNode.getLink();

        try 
            {
            switch (op)
                {
                case '+': result = number1 + number2;
                case '-': result = number1 - number2;
                case '*': result = number1 * number2;
                case '/': result = number1 / number2;

                default: System.out.println("Something has gone wrong.");
                }
            }
            catch (ArithmeticException e)
                {
                    System.out.println("! Division with Zero !");
                }
        }

}

Die FloatNode class:
Code:
public class FloatNode
{
    private float data;
    private FloatNode link;
   
public FloatNode()
    {
    data=0;
    link=null;
    }

public FloatNode(float initialData, FloatNode initialLink)    // Explicit Constructor
    {
        data = initialData;
        link = initialLink;
    }

public float getData()                                    // returns the data
    {
    return (data);
    }

public FloatNode getLink()                                // returns the link
    {
    return (link);
    }
}

Die CharNode class:
Code:
public class CharNode
{
    private char data;
    private CharNode link;

public CharNode()
    {
    data=0;
    link=null;
    }

public CharNode(char initialData, CharNode initialLink)    // Explicit Constructor
    {
        data = initialData;
        link = initialLink;
    }

public char getData()                                    // returns the data
    {
    return data;
    }

public CharNode getLink()                                // returns the link
    {
    return link;
    }
}

und noch die check class
Code:
import java.lang.*;
class check
{
String str = null;

public check(String str1)
    { str = str1; }

public check()
    {
            
    }

public boolean Letter ()
    {
    int close = 0, open = 0, digit = 0, op = 0;
    for (int i=0;i<str.length();i++)
      {
      char c;
      c = str.charAt(i);
      if (Character.isDigit(c) == true)
          digit = digit + 1;
      if (c == '+' || c == '-' || c == '*' || c == '/')
          op = op + 1;
      if (c == '(')
         open = open + 1;
      if (c == ')')
         close = close + 1;
      }
    if ((open == close) && (str.length() - close - open - digit - op == 0))
            return true;
    else 
            return false;
   }

public int Length ()
   {
   int m = str.length();
   return m;
   }
}
 
B

Beni

Gast
Es soll andere geben die die Frage geschickter stellen...

Du bist ja noch nicht ganz fertig, da hab ich vielleicht ein Problemchen aufgefangen, dass Du sowieso noch nicht gelöst hast.

Vielleicht musst Du genauer erklären, was dein Problem ist.

1. Das erste Problem ist, dass Du gar keine Liste aufbaust:
Code:
else{
  FloatNode newFloat = new FloatNode(number, FloatNode);
  System.out.println("Number");
}
Die Variable newFloat existiert nur innerhalb dieses else{}-Blockes.
FloatNode ist null, und bleibt null.
Also das newFloat weglassen!

Und: Variablen sollten immer mit einem Kleinbuchstaben beginnen, diese Variable FloatNode verwirrt ganz schön.

:arrow:
Code:
FloatNode floatNode = ...
... // andere if's und else's
else{
  floatNode = new FloatNode(number, floatNode);
  System.out.println("Number");
}

2. Diese Methode calculate, hier ein Ausschnitt
Code:
    FloatNode floatNode = null;
    //CharNode Operator=null;

    System.out.println("This is the calculate method.");
    //pop the Operator stack and store it in the char operator value
    CharNode test = new CharNode();
    char op = test.getData();
    CharNode newOp = test.getLink();

    //pop the FloatNode stack and store it in the float number2 value
    float number2 = floatNode.getData();
da hast Du irgendwie vergessen den floatNode zu setzen. Ich durchschaue den Algorithmus noch nicht ganz, aber wenn Du die Methode einfach auf calculate( FloatNode floatNode ) umschreibst?

3. Ein ganz fieser Fehler ist dir im switch-case passiert:
Code:
      switch (op) {
        case '+':
          result = number1 + number2;
          break;
        case '-':
          result = number1 - number2;
          break;
        case '*':
          result = number1 * number2;
          break;
        case '/':
          result = number1 / number2;
          break;

        default:
          System.out.println("Something has gone wrong.");
      }
Da musst Du überall ein break machen, sonst läuft das Ganze einfach bis zum default runter

4. Und nur so eine Frage nebenbei: was machst Du eigentlich mit dem berechneten Wert? Der schwirrt noch ein bisschen in der Methode rum, bis er gelöscht wird :wink:

mfg Beni
 

Marcus

Mitglied
Hallo

Das mit den Switch case und den Float node habe ich verbessert.
Ich werde mir das ganze morgen noch mal in Ruhe anschauen und dann mal sehen was man noch so machen kann.
Vielen Dank schon und ich melde wenn ich was genaueres habe.

Ich hätte natürlich auch schreiben ich suche was für ein Projekt aber ich möchte es doch gerne selber schaffen die Problemstellung zu lösen, sonst lernt man ja garnichts. hi

Marcus
 

Marcus

Mitglied
Ich habe nun noch mal einiges aufgeräumt und variablen umbenannt. Mein Plan ist es im Mainprogramm den Stack aufzubauen und dann mit der calculate class den auszulesen und berechnen.
Ich wollte dann mit

calculate(numstack);

den Pointer auf meine calculate class übergeben und damit dann den Stack wieder zurückzulesen. Dann nach der Berechnung werde ich das Ergebniss auf meinen Stack schieben und wieder von vorne anfangen. Ganz am Ende sollte dann nur noch das Ergebniss im Stack sein welches ich dann ausgeben kann.
Soweit meine Überlegung aber irgendwie will es dann in der Praxis nicht so recht klappen.
Ich bekommen folgende Fehlermeldung. Demnach scheint irgenwas mit meinem Pointer nicht zu stimmen.

java.lang.NullPointerException
at assignment1a.calculate(assignment1a.java:106)
at assignment1a.main(assignment1a.java:46)


Marcus

Hier habe ich noch mal meine neue main class

Code:
import java.lang.*;
import java.util.*;
import java.io.*;
class assignment1a
{
/*
Assignment 1a 
Marcus Pool
264744
*/
public static void main (String args[])
   {
   int length, test;
   float number=0;
   boolean checking;
   char input;
   KeyboardInput in = new KeyboardInput();

   FloatNode numstack = null;
   CharNode Operator = null;
   
   System.out.println("Enter a fully parenthesised arithmetic expression: ");
   String s = in.readString();				//reading in a string from the keyboard
   String cin;
   length = s.length();                                 //getting the lenght of the input string

   check expression = new check(s);
   check evaluate = new check();
       if (expression.Letter() == false) 
            {
                    System.out.println("Invalid arithmetic expression!");
                    System.exit(0);
            }
       else
                    System.out.println("Valid arithmetic expression.");

   for (int i = 0 ; i < length ; i ++)
   {
        input = s.charAt(i);
            if (input == '(')
                continue;
        
            else if (input == ')')
                {
                //System.out.println("Operator ) ");
                calculate(numstack);
                continue;
                }

            else if (input == '+')
                {
                //System.out.println("Operator + ");
                Operator = new CharNode ('+' , Operator);
                continue;
                }

            else if (input == '-')
                {
                //System.out.println("Operator - ");
                Operator = new CharNode ('-' , Operator);
                continue;
                }
            
            else if (input == '/')
                {
                //System.out.println("Operator / ");
                Operator = new CharNode ('/' , Operator);
                continue;
                }
   
            else if (input == '*')
                {
                System.out.println("Operator * ");
                Operator = new CharNode ('*' , Operator);
                continue;
                }
            else
                {
                //cin = input;
                System.out.println("the number is: " + number);
                FloatNode floatnode = new FloatNode(number, numstack);
                }
   }
   
   //print the solution 
   //it is the last entry in the linked list
   System.out.println("The result is : " + numstack.getData());
}
public static void calculate(FloatNode floatNode) 
        {
        float result = 0;

   	char Operator;
        FloatNode numstackcalc = floatNode;
        //FloatNode floatnode = floatNode;
        //numstack = floatnode;
        //CharNode Operator=null;
        
        System.out.println("This is the calculate method.");
        //pop the Operator stack and store it in the char operator value
	CharNode test = new CharNode();
        char op = test.getData();
        CharNode newOp = test.getLink();

        //pop the FloatNode stack and store it in the float number2 value
        float number2 = numstackcalc.getData();
        numstackcalc = numstackcalc.getLink();
        
        //pop the FloatNode stack and store it in the float number1 value
        float number1 = numstackcalc.getData();
        numstackcalc  = numstackcalc.getLink();

        try 
            {
            switch (op)
                {
                case '+': result = number1 + number2; break;
                case '-': result = number1 - number2; break;
                case '*': result = number1 * number2; break;
                case '/': result = number1 / number2; break;

                default: System.out.println("Something has gone wrong.");
                }
            }
            catch (ArithmeticException e)
                {
                    System.out.println("! Division with Zero !");
                }
        }
        //push the result back onto the Float Stack
        //FloadNode numstackcalc = new FloadNode (result, numstackcalc);
}
 
B

Beni

Gast
Hm, ich habs mal ein bisschen abgändert, und jetzt kann ich immerhin (1+2) zusammenrechnen.

Calculate noch ein Operator übergeben:
Code:
  public static void calculate(FloatNode floatNode, CharNode test) {
    float result = 0;

   ... // was dazwischen liegt

    char op = test.getData();
    CharNode newOp = test.getLink();

natürlich entsprechend aufrufen:
Code:
      else if (input == ')') {
        //System.out.println("Operator ) ");
        calculate(numstack, Operator);
        continue;
      }


und den FloatNode etwas anders hinzugefügt:
Code:
      else {
        //cin = input;
        number = Float.valueOf( Character.toString( input ) ).floatValue();
        System.out.println("the number is: " + number);
        numstack = new FloatNode(number, numstack);
      }


Ein Gedanke: eine Klasse Stack, bei der man einfach
Stack.push( float value ) und float value = Stack.pop(); aufrufen kann.
Dann könnte man in der Methode calculate vielleicht die Stacks einfacher abbauen... (Die Nodes hast Du ja schon geschrieben, also wäre das nicht mehr viel Aufwand).

mfg Beni
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Linked List set-Methode Java Basics - Anfänger-Themen 2
G Linked list, Methode zum Vertauschen von Elementen Java Basics - Anfänger-Themen 14
T KlausurÜbung- Förderband-Linked List Java Basics - Anfänger-Themen 53
hooked Verkettete Liste / linked list Java Basics - Anfänger-Themen 2
S Methoden Linked List Methoden können nicht aufgerufen werden Java Basics - Anfänger-Themen 1
L Linked List - Array List Java Basics - Anfänger-Themen 2
SexyPenny90 Implementierung einer doubly linked list Java Basics - Anfänger-Themen 5
G Linked List Programm add Problem Java Basics - Anfänger-Themen 5
S Synchronisieren einer Linked List Java Basics - Anfänger-Themen 16
E Linked List generisch Java Basics - Anfänger-Themen 5
H Linked List sortieren Java Basics - Anfänger-Themen 9
B Linked-List Java Basics - Anfänger-Themen 2
T einfügen bei einer Linked List Java Basics - Anfänger-Themen 8
J linked list add ? Java Basics - Anfänger-Themen 2
J linked list Java Basics - Anfänger-Themen 13
M Beispiel für Linked List Java Basics - Anfänger-Themen 9
G Linked List mit Interface erstellen Java Basics - Anfänger-Themen 10
N Linked list sortieren Java Basics - Anfänger-Themen 8
K Java Linked List Java Basics - Anfänger-Themen 11
W löschen in einer single linked list Java Basics - Anfänger-Themen 3
Gaudimagspam Linked Liste Java Basics - Anfänger-Themen 4
G (Linked)HashMap sortieren Java Basics - Anfänger-Themen 1
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
J Array.list vergleichen Java Basics - Anfänger-Themen 1
B Vektor vs List Java Basics - Anfänger-Themen 4
volcanos Addition -> List<Integer> mit Arrays.asList() versus List<Integer>ArrayList<>() Java Basics - Anfänger-Themen 14
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
volcanos List & ArrayList nach Familiennamen abfragen Java Basics - Anfänger-Themen 57
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
L Datentypen Array List Java Basics - Anfänger-Themen 9
J Java List, Bitte um Hilfe Java Basics - Anfänger-Themen 15
J Java List, bitte um Hilfe Java Basics - Anfänger-Themen 3
F GSON file mit einer List erstellen Java Basics - Anfänger-Themen 2
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
O Collections.sort und List.sort mit Lambda Verwirrung Java Basics - Anfänger-Themen 5
J String Array zu Map<Character, List<Character>> mit Streams Java Basics - Anfänger-Themen 1
I csv auslesen, mittels List Java Basics - Anfänger-Themen 18
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
I Methoden List.contains() beim 2. Element = true Java Basics - Anfänger-Themen 1
N HashMap in List good practice? Java Basics - Anfänger-Themen 2
B SWAP List; Liste neu anordnen Java Basics - Anfänger-Themen 4
W Stream Array List - Frage Java Basics - Anfänger-Themen 5
E Interface List nicht als Collection an erkannt. Java Basics - Anfänger-Themen 14
X Array List geordnet ausgeben. (JSF und JAVA) Java Basics - Anfänger-Themen 1
D new arraylist (List) dynamisch erstellen Java Basics - Anfänger-Themen 1
Yjuq Generic Methode - Wie muss die List Definition aussehen? Java Basics - Anfänger-Themen 3
M List<String> auswählen Java Basics - Anfänger-Themen 42
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
B Unterschied zwischen (List<T> a) und (T[] a) Java Basics - Anfänger-Themen 7
T HashSet in List-Object Java Basics - Anfänger-Themen 5
B ENUM to List<String> konvertieren Java Basics - Anfänger-Themen 2
E Array-list mit einer bestimmten Länge Java Basics - Anfänger-Themen 17
B Sorting List und Remove Java Basics - Anfänger-Themen 2
B String: suche nach Wörter und in List<String> speichern Java Basics - Anfänger-Themen 3
M Methode überladen - Array List Java Basics - Anfänger-Themen 5
L LIST.ADD Java Basics - Anfänger-Themen 2
M XWPF - Bullet Point list erstellen Java Basics - Anfänger-Themen 1
I <List> sortieren Java Basics - Anfänger-Themen 2
N Klassen List-Art Java Basics - Anfänger-Themen 5
S List<T<X,Y> sortieren Java Basics - Anfänger-Themen 5
Salo Datentypen "Doppelt" List(e) ("gesucht") Java Basics - Anfänger-Themen 6
F .csv Export aus einer list Java Basics - Anfänger-Themen 25
D Komischer Fehler nach <Integer> List Java Basics - Anfänger-Themen 2
B in einem abstrakten Set ,Elemente einer einfache verkettete List epeichern Java Basics - Anfänger-Themen 13
T List und ArrayList Java Basics - Anfänger-Themen 3
UnityFriday method getPrevious in class List<ContentType> cannot be applied to given types Java Basics - Anfänger-Themen 29
T Datentypen InputStream to list of Int (or similar) Java Basics - Anfänger-Themen 4
D Input/Output CSV Parser list unvollständig Java Basics - Anfänger-Themen 25
V Erste Schritte Dateinamen aus einer FIle[] in eine List Java Basics - Anfänger-Themen 11
U JAXB - List wird nicht ausgefüllt Java Basics - Anfänger-Themen 1
J Einfach verkettet List: Ausgabe ohne null Java Basics - Anfänger-Themen 11
D Bestimmten Wert aus Array List ausgeben Java Basics - Anfänger-Themen 7
V Personenverwaltung mit List<>, falsche Ausgaben Java Basics - Anfänger-Themen 5
M List befüllen Java Basics - Anfänger-Themen 3
S Datentypen List.toString wirft NullPointerException Java Basics - Anfänger-Themen 5
P Anlegen und Abfragen von Array List Java Basics - Anfänger-Themen 4
S Element von List<E> in String umwandeln Java Basics - Anfänger-Themen 3
A Wie nutze ich List<List<String>> Java Basics - Anfänger-Themen 4
M Endlos schleife in List Java Basics - Anfänger-Themen 5
P Zufallszahlen ohne zahlen einer List Java Basics - Anfänger-Themen 21
C Array List mit String vergleichen und Fehlermeldung ausgeben Java Basics - Anfänger-Themen 6
S Probleme bei Ausgabe von rekursiver Methode (List) Java Basics - Anfänger-Themen 16
T Tabstopp in AWT-List? Java Basics - Anfänger-Themen 8
P Doppelte Einträge in eine List Java Basics - Anfänger-Themen 5
M Wozu Upcasting? Am Beispiel List = ArrayList Java Basics - Anfänger-Themen 2
A List mit integern füllen Java Basics - Anfänger-Themen 4
D sortieren von List<> Java Basics - Anfänger-Themen 2
B List - Drag&Drop Java Basics - Anfänger-Themen 8
C List Abfragenproblem Java Basics - Anfänger-Themen 3
J List als anonyme Klasse Java Basics - Anfänger-Themen 9
H Collections List in List<SpecificType> als stat. generische Methode zurückgeben Java Basics - Anfänger-Themen 4
F Wozu braucht man array list? Java Basics - Anfänger-Themen 29
T Collections Wie funktioniert List() ? Java Basics - Anfänger-Themen 7
Kenan89 Java Date List Java Basics - Anfänger-Themen 4
tux20 Problem beim Schreiben von List to File Java Basics - Anfänger-Themen 2
K Frage Set List Java Basics - Anfänger-Themen 3
M Array List ausgeben Java Basics - Anfänger-Themen 13
C Typen aus List<Object[]> ändern Java Basics - Anfänger-Themen 7
S Gute List Implementation Java Basics - Anfänger-Themen 5
A List Array - wie instanzieren Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben