deepthroat
Erfahrenes Mitglied
Google: "Java stack"Wie arbeite ich in Java mit einem Stack - habe ich noch nicht gemacht?! Gibts dafür ein allgemeines Vorgehen/Befehle/Methoden in Java?
Gruß
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
Google: "Java stack"Wie arbeite ich in Java mit einem Stack - habe ich noch nicht gemacht?! Gibts dafür ein allgemeines Vorgehen/Befehle/Methoden in Java?
Dazu mal folgendes:wenn Zeile == IF dann speichere Wert von Bedingung auf dem Stack.
bei ELSEIF Wert mit dem Top Stack vergleichen, falls FALSE, Wert vom Stack entfernen, neuen Wert von Bedingung drauf.
bei ELSE Wert des Stacks negieren.
bei ENDIF Wert vom Stack entfernen.
boolean ifcheck; //Variable, ob IF-Bedingung true oder false ist
BufferedReader buff = new BufferedReader(new FileReader(path + "myTextfile.txt"));
Stack stack = new Stack();
//jede Zeile durchgehen
while ( (line = buff.readLine()) != null) {
if( line.startsWith("IF") || line.startsWith("if") ){
//prüfen, ob IF-Bedingung true oder false ist (funktioniert bereits!)
ifcheck = checkIF(line); //checkIF(line) gibt true oder false zurück
//bei IF - true/false auf Stack
if(ifcheck == true){
stack.push( "true" );
}else{
stack.push( "false" );
}
}else if( line.startsWith("ELSE") || line.startsWith("else") ){
//bei ELSE Stack negieren
if( stack.peek() == "true" ){
stack.set(stack.size(), "false");
}else{
stack.set(stack.size(), "true");
}
}else if( line.startsWith("ENDIF") || line.startsWith("endif") ){
//Wert vom Stack löschen
try{
stack.pop();
}catch(EmptyStackException e){
JOptionPane.showMessageDialog(null, "Stack ist leer!");
}
}
//Auswahl der relevanten Zeilen
if( stack.peek() == "true" ){
JOptionPane.showMessageDialog(null, "oberstes Stackelement ist TRUE. Stacksize="+stack.size() );
strBuffer.append(line + "\n");
}else if( stack.peek() == "false" ){
JOptionPane.showMessageDialog(null, "oberstes Stackelement ist FALSE. Stacksize="+stack.size() );
}
}//while close
//zur Überprüfung: neues Textfile nur mit relevanten Zeilen erstellen
//löscht evtl. exist. Textfile, bevor es neu erstellt wird
File f = new File(path + "myTextfile_NEU.txt");
if(f.exists()){
f.delete();
}
BufferedWriter buff2 = new BufferedWriter(new FileWriter(path + "myTextfile_NEU.txt"));
buff2.write(strBuffer.toString());
buff2.close();
IF 1==9
textzeile1
if 8==8
textzeile2
if 3<7
textzeile3
endif
else
textzeile4
endif
textzeile5
ELSE
textzeile6
if 4<6
textzeile7
else
textzeile8
endif
textzeile9
ENDIF
while () {
line = line.toUpperCase();
if( line.startsWith("IF")) {
stack.push(checkIF(line));
} else if (line.startsWith("ELSEIF")) { // Reihenfolge ist wichtig!
if (!(bool)stack.peek()) {
stack.pop();
stack.push(checkIF(line));
}
} else if (line.startsWith("ELSE") {
stack.push(!(bool)stack.pop());
} else if (line.startsWith("ENDIF") {
stack.pop();
} else if (stack.empty() || (bool)stack.peek()) {
// hier Zeile ausgeben
}
}
function checkIF(line) {
var exp = line.substr(3);
return eval(exp);
}
var text = ("IF 1==9;textzeile1;if 8==8;textzeile2;if 3<7;textzeile3;endif;else;" +
"textzeile4;endif;textzeile5;ELSE;textzeile6;if 4<6;textzeile7;else;textzeile8;" +
"endif;textzeile9;ENDIF").split(';');
var stack = new Array();
stack.push(true); // vor ersten if Ausgabe angeschaltet
stack.top = function () {
return this[this.length-1];
}
for (var i = 0; i < text.length; ++i) {
var line = text[i];
if(/^IF/i.test(line)) {
stack.push(stack.top() && checkIF(line));
} else if (/^ELSEIF/i.test(line)) { // Reihenfolge ist wichtig!
if (!stack.top()) {
stack.pop();
stack.push(stack.top() && checkIF(line));
}
} else if (/^ELSE/i.test(line)) {
var b = stack.pop();
stack.push(stack.top() && !b);
} else if (/^ENDIF/i.test(line)) {
stack.pop();
} else if (stack.top()) {
// Im if/else Zweig dessen Bedingung "TRUE" ist...
document.writeln(line);
}
}
textzeile6
textzeile7
textzeile9
Hi.
Ich hatte nicht bedacht, das die Entscheidung, ob man die Zeilen ausgeben kann, auch von der Bedingung des letzen if (und vorletzten if usw.) abhängen.
Hier mal ein Test in JavaScript (kannst du ja einfach übersetzen):
Wenn du das im Browser ausführst, erhälst du als Ergebnis:Javascript:function checkIF(line) { var exp = line.substr(3); return eval(exp); } var text = ("IF 1==9;textzeile1;if 8==8;textzeile2;if 3<7;textzeile3;endif;else;" + "textzeile4;endif;textzeile5;ELSE;textzeile6;if 4<6;textzeile7;else;textzeile8;" + "endif;textzeile9;ENDIF").split(';'); var stack = new Array(); stack.push(true); // vor ersten if Ausgabe angeschaltet stack.top = function () { return this[this.length-1]; } for (var i = 0; i < text.length; ++i) { var line = text[i]; if(/^IF/i.test(line)) { stack.push(stack.top() && checkIF(line)); } else if (/^ELSEIF/i.test(line)) { // Reihenfolge ist wichtig! if (!stack.top()) { stack.pop(); stack.push(stack.top() && checkIF(line)); } } else if (/^ELSE/i.test(line)) { var b = stack.pop(); stack.push(stack.top() && !b); } else if (/^ENDIF/i.test(line)) { stack.pop(); } else if (stack.top()) { // Im if/else Zweig dessen Bedingung "TRUE" ist... document.writeln(line); } }
GrußCode:textzeile6 textzeile7 textzeile9
Was diese Funktion macht, steht doch da... Die Funktion ist doch dort implementiert. Die Länge würde das Attribut length liefern.Was macht 'stack.top()' - liefert mir das die Länge vom Stackspeicher?
Ok, das habe ich mir dann auch so gedacht...Die Funktion top() liefert den obersten Wert vom Stack - also bei der Java Stack Klasse das gleiche wie die Methode peek().
if(/^IF/i.test(line)) {
stack.push(stack.top() && checkIF(line));
}
Weil's dann nicht funktioniert.Wieso nicht einfach 'stack.push(checkIF(line))' oder 'stack.push("true")' bzw. 'stack.push("false")'?
IF 5 = 10
IF 5 = 5
PRINT 5
ENDIF
ELSE
PRINT 9
ENDIF