Archief - [PROG][JAVA] Infix notatie -> postfix notatie

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Ble$$ed^

Legacy Member
Zelf ben ik nog niet zo heel lang bezig met programmeren, mijn excuses als er loeiers van fouten zouden in staan.

De bedoeling is dus dat ik door middel van een Stack(Stapel) een infix (bvb 2*3/5) naar een postfix(bvb 2 3*5/) notatie ga omzetten.

Ik heb via pseudocode het algoritme in java proberen te zetten. Hij compiled zonder problemen , maar als uitvoer geeft hij enkel mijn cijfers en niet zoals in het voorbeeldje eerder vermeld.

Hier is alvast de voorlopige code van men opdracht. Khoop dat jullie me kunnen helpen.

mvg

Code:
import javax.swing.*;

	//STACK VOOR KARAKTERS\\
public class StackKar
{
	private char stackArray[];
	private char top;
	private int length;
	private static final int DEFAULT_LENGTH = 10;
	public StackKar()
	{
		length = DEFAULT_LENGTH;
		stackArray = new char[length];
		top=0;
	}
	public boolean isEmpty()
	{
		if(top==0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	public void push(char c)
	{
		if(top == length)
		{
			allocateMore();
		}
		stackArray[++top] = c;
		
	}
	public char pop()
	{
		if(isEmpty())
		{
			JOptionPane.showMessageDialog(null,"Stack leeg: er kan geen element van de Stack afgehaald worden");
		}
		top--;
		return stackArray[top];
	}
	public char peek()
	{
		if(isEmpty())
		{
			JOptionPane.showMessageDialog(null,"Stack leeg: er kan geen topelement van de Stack getoond worden");
		}
		return stackArray[top-1];
	}
	public int size()
	{
		return top;
	}
	public void allocateMore()
	{
		char original[] = stackArray;
		length = length * 2;
		stackArray = new char[length];
		for(int i = 0;i<length/2;i++)
		{
			stackArray[i] = original[i];
		}
	}
}

Dit is de infix -> postfix
Code:
import javax.swing.*;
import java.awt.*;

public class PostfixTest extends StackKar
{
    public static void main(String args[])
    {
    	StackKar s = new StackKar();
        String infix = JOptionPane.showInputDialog("Geef infix notatie");
        char array[] = infix.toCharArray(); //String naar array van characters 
        int lengte = array.length; // arraylengte meegeven
		char symbool,haakje; 
		String tpostfix=""; //tijdelijke opslag
		String postfix; // uiteindelijke output
								
								///< TEST >\\\
								
		System.out.println(lengte); // het aantal karakters controleren\\
										
		for (int teller=0; teller<array.length; teller++)
             {
        		symbool = array[teller];
        		
        		if((symbool != '+')&&
        		   (symbool != '-')&&
        		   (symbool != '/')&&
        		   (symbool != '*')&&
        		   (symbool != '(')&&
        		   (symbool != ')'))
        		   {
        		   		tpostfix = tpostfix +symbool;
        		   } 
					         		   		
         	else 
         		{	
         			if (s.isEmpty() || symbool == '(' || prioriteit(symbool) > prioriteit(s.peek())) 
         				{
         					 s.push(symbool);
         				}        		   		
         		        			
        			if(symbool==')' )
        				{
        					while(s.peek() != '(')
        						{tpostfix=tpostfix +s.pop();}
        					haakje= s.pop();	
        				}//einde 2de
        			if(prioriteit(symbool)<=prioriteit(s.peek()))
        				{
        					while ((prioriteit(symbool) <= prioriteit(s.peek())  )  )  // + OF NIET (s.isEmpty())   moet er nog bijkomen \\
        						{tpostfix=tpostfix + s.pop();}	
        					s.push(symbool);    
        				}//einde 3de
        	   		   
    			}
    		teller=teller+1;			
	}
	while(!s.isEmpty())
		{
			tpostfix=tpostfix +s.pop(); //floep et eruit en steek et erin
		}
	postfix=tpostfix;
	System.out.println(infix);
	System.out.println(postfix);
 }
 	
 	//methode prioriteit
    public static int prioriteit(char symbool)
	{
		
		if(symbool == '*' || symbool == '/'){
			return  2;
			}
			
		if(symbool == '+' || symbool == '-'){
			return 1;
			}
			
		else 
			return  0;	
				
				
 	}
 
 
}

.Acku.

Legacy Member
Het algoritme kan je makkelijk debuggen, als je een IDE hebt kijk eens hoe dat moet en plaats strategische breekpunten. Het is kinderspel dan, je zal je logische fouten meteen zien.

Ik wou je vooral vragen of je wel van java.util.Stack hebt gehoord? Dat doet exact hetzelfde, en ja niet met primitives maar wel met Char of String, wat geen probleem is.
Uw onnodige eigen implementatie heeft op het eerste zicht twee rariteiten:
- Uw achterliggende collectie (een array) vergroot wel dynmaisch maar verkleint zichzelf nooit. Erger nog, het houdt alles in het geheugen. Op null zetten is geen luxe. Als je het gebruikt voor een zin van 10.000 karkaters en nadien enkel nog voor simpele woorden blijft het 10k karakters bevatten.
- Het bevat front-end GUI logica, wat het helemaal niet hebrurikbaar maakt voor mensen zonder GUI of voor mensen die andere booschappen willen tonen.
Als ik een leerkracht was je zou daar wat punte op verliezen, ook al is het voor de rest vrij goed ge-implementeerd.

Ble$$ed^

Legacy Member
van die java.util.Stack heb ik inderdaad nog niet gehoord ;D

IDE klinkt mij wel bekend om de oren, maar dat is ook alles. Ik zal ff wat opzoekwerk doen.

Thx voor de snelle reply (k)

.Acku.

Legacy Member
IDE is uw programma waarmee ge editeert, compiled en runned. Tenzij ge alles via DOS/Shell doet.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan