Permalänk
Medlem

[Java] RPN-Räknare.

Hej

Jag ska göra en RPN räknare i java med hjälp av stackar.

Skapa ett program som läser av argumenten som kommer in till ett javaprogram. Om srgumentet är en siffra läggs det på stacken, om det är en operator (+-x/)så ska vi poppa två tal och applicera operatorn, och lägga tillbaka resultatet på stacken. Tänk på att använda x för gånger. Du kommer att få problem om du använder *

Exempel: argumenten ”1 2 +”. De första tecknet är en etta läggs på stacken nästa tecken är en tvåa den läggs också på stacken, sedan kommer ett plus. Då ska vi poppa två tal från stacken i detta fall 1 och 2 och lägga ihop dem.

OBS!! Jag ber er inte att göra min hemuppgift åt mig!!
Men jag behöver tips...

Visa signatur

It's a tarp!

Permalänk
Medlem

Hur skulle du löst det med papper och penna?

Du kan ju alltid börja med att dela upp uppgiften i mindre delar. Du har ju t.ex. inläsning av en textsträng, uppdelning av den i tokens (alltid ett mellanslag mellan operatorer och operander) m.m.

Hur tänker du? Vilka delar har du luskat ut hur du ska lösa?

Permalänk
Medlem

hmm, Vet att jag måste ha något som gör att man skiljer text från bokstäver och operatorer.

Fått tips på att man kan använda InputStreamReader fast jag vet inte direkt hur det funkar.

Visa signatur

It's a tarp!

Permalänk
Medlem

Några Java API:er för att komma igång, då.

Jag tycker det är enkelt att läsa in text från tangentbordet med hjälp av Scanner. Det finns väldigt många sätt att sedan splitta upp en sträng men StringTokenizer borde passa väldigt bra för det här ändamålet.

Börja knacka kod och visa upp här så ska du nog se till att du kan få bra hjälp på vägen.

Permalänk
Medlem

Under förutsättningen att du lyckas läsa in tecken och tal så kan lite pseudokod se ut enligt följande:

Stack st = ny tom Stack för alltid { ny_symbol = läs_tecken_eller_tal() om ny_symbol är ett tal { st.push(ny_symbol) } annars { del_resultat = operator(ny_symbol, st.pop(), st.pop() ) st.push(del_resultat) } } funktion operator(tecken, tal1, tal2) { om tecken lika med + returnera tal1+tal2 om tecken lika med * returnera tal1*tal2 osv }

med referens till javas stack: http://docs.oracle.com/javase/7/docs/api/java/util/Stack.html

Du bör dock fundera lite över hur du ska och kan läsa in tecken eller tal.
Om du begränsar dig till att endast hantera ensiffriga tal som input så räcker det med att läsa tecken för tecken, men om du ska tillåta tal med flera siffror och kanske decimaltal också så får du tänka till lite hur du urskiljer en följd av tecken på rätt sätt.

Lycka till

Visa signatur

weeeee

Permalänk
Medlem

Om du läser från kommandoraden behövs ingen tokenization, då är ju allt en lista med tokens (självklart under förutsättning att allt separeras med mellanslag).

Sen skapar man bara en lämplig datastruktur (LinkedList) som stack och pushar om det är ett heltal, poppar och pushar om det är en operator.

I psudokod;

Z := Heltalen O := {+,-,/,*} A := Arguments S := Stack I := 0 While I < |A|: T := A[I] If T in Z: S.push T ElseIf T in O L := S.pop R := S.pop Switch T case +: S.push L + R case -: S.push L - R case /: S.push L / R case *: S.push L * R End End I := I + 1 End R := S.pop

R kommer nu innehålla resultatet av körningen.

Jag kan presentera en Java-lösning om det önskas.

Permalänk
Medlem

Tack så mycket

Visa signatur

It's a tarp!