Programmideen für Anfänger
-
Das hatten doch die HP-Taschenrechner, oder?
Damit waren die Leute viel schneller als mit normaler Infixnotation.
-
ist postfix die umgekehrt polnische notation?
mein éhemaliger info-lehrer meinte mal, dass man damit parser eleganter und schneller machen kann.
-
Mr. Pink schrieb:
ist postfix die umgekehrt polnische notation?
mein éhemaliger info-lehrer meinte mal, dass man damit parser eleganter und schneller machen kann.jup, ist es und ja, hat er recht
wenn nen term in UPN vorliegt, muss man ihn nur genau so, wie man ihn einliest, auf nen stack schreiben und jedesmal, wenn man auf nen operator trifft die jeweilige anzahl an operanden aus dem stack holen, mit dem operator verknüpfen und wieder reinstecken.
überprüfung auf syntaktische korrektheit geschieht dabei ganz automatisch (wenn man kurz drüber nachdenkt, merkt man auch warum)
-
toll, was man so alles macht, wenn einem fad is ^^
import java.util.Stack; import java.util.StringTokenizer; class UPN { private static Stack<Double> stack = null; public static Double parse(String upnTerm) { stack = new Stack<Double>(); StringTokenizer st = new StringTokenizer(upnTerm, " "); while(st.hasMoreTokens()) { String atom = st.nextToken(); if(atom.equals("+")) { Double rhs = stack.pop(); Double lhs = stack.pop(); stack.push(lhs + rhs); } else if(atom.equals("-")) { Double rhs = stack.pop(); Double lhs = stack.pop(); stack.push(lhs - rhs); } else if(atom.equals("*")) { Double rhs = stack.pop(); Double lhs = stack.pop(); stack.push(lhs * rhs); } else if(atom.equals("/")) { Double rhs = stack.pop(); Double lhs = stack.pop(); stack.push(lhs / rhs); } else { stack.push(Double.parseDouble(atom)); } } return stack.pop(); } } public class Testing { public static void main(String args[]) { System.out.println( UPN.parse("3 4 + 5 *") ); } }
ein UPN parser in java. verdammt kurz oder?
und man könnt den sogar noch kürzer machen, wenn man wollte.
-
"Java", "wollen".
Hmm, irgendetwas stimmt da nicht.
-
Java ist schon relativ elegant, da ist was dran
class UPN { public static Double parse(String upnTerm) { Stack<Double> stack = new Stack<Double>(); StringTokenizer st = new StringTokenizer(upnTerm, " "); while(st.hasMoreTokens()) { String atom = st.nextToken(); if(atom.equals("+")) stack.push(stack.pop() + stack.pop()); else if(atom.equals("-")) stack.push( (-1)*(stack.pop()-stack.pop())); else if(atom.equals("*")) stack.push( stack.pop()* stack.pop()); else if(atom.equals("/")) stack.push( 1 / (stack.pop() / stack.pop()) ); else stack.push(Double.parseDouble(atom)); } return stack.pop(); } }
uff, hatteste Recht thordk