I have all my code for this. I have the code to read a txt file, write a txt file, convert the infix to postfix and evaluate it. I am now just having trouble putting it all together. I need it to read the text from a file convert each line to postfix and evaluate it, then write it to a seperate file. thanks for any help.

package collection;
import java.io.*;


public class Postfix {
  private Stack theStack;

  private String input;

  private String output = "";

  public Postfix(String in) {
    input = in;
    int stackSize = input.length();
    theStack = new Stack(stackSize);
  }

  public String doTrans() 
  {
    for (int j = 0; j < input.length(); j++) 
    {
    	input.trim();
      char ch = input.charAt(j);
      switch (ch) {
      case '+': 
      case '-':
        gotOper(ch, 1); 
        break; //   (precedence 1)
      case '*': // it's * or /
      case '/':
        gotOper(ch, 2); // go pop operators
        break; //   (precedence 2)
      case '(': // it's a left paren
        theStack.push(ch); // push it
        break;
      case ')': // it's a right paren
        gotParen(ch); // go pop operators
        break;
      default: // must be an operand
        output = output + ch; // write it to output
        break;
      }
    }
    while (!theStack.isEmpty()) {
      output = output + theStack.pop();

    }
      output.trim();
   // System.out.println(output);
    return output; // return postfix
  }

  public void gotOper(char opThis, int prec1) {
    while (!theStack.isEmpty()) {
      char opTop = theStack.pop();
      if (opTop == '(') {
        theStack.push(opTop);
        break;
      }// it's an operator
      else {// precedence of new op
        int prec2;
        if (opTop == '+' || opTop == '-')
          prec2 = 1;
        else
          prec2 = 2;
        if (prec2 < prec1) // if prec of new op less
        { //    than prec of old
          theStack.push(opTop); // save newly-popped op
          break;
        } else
          // prec of new not less
          output = output + opTop; // than prec of old
      }
    }
    theStack.push(opThis);
  }

  public void gotParen(char ch)
  { 
    while (!theStack.isEmpty()) 
    {
      char chx = theStack.pop();
      if (chx == '(') 
        break; 
      else
        output = output + chx; 
    }
  }
  public int evaluate()
	{
		Stack theStack = new Stack(50);
		int result = 0;
		
		for(int j = 0; j < input.length(); j++)
		{
			char ch = input.charAt(j);
			if(ch >= '0' && ch <= '9')
				theStack.push2((int)(ch- '0'));
			else{
				
				int num2 = theStack.pop2();
				int num1 = theStack.pop2();
			
			
		switch(ch)
		{
	/*	case '0':
		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
		case '8':
		case '9':
			theStack.push((char)(ch - '0'));
			break; */
			
		case '+':
					
			result =  num1 + num2;
			break;
		case '-':
			result = num1 - num2;
			break;
		case '*':
			result = num1 * num2;
			break;
		case '/':
			result = num1 / num2;
			break;
		case '%':
			result = num1 % num2;
			break;
		default:
			result = 0;
		}//end SWITCH
			theStack.push2(result);
			}
	  }//end FOR
			result = theStack.pop2();
			return result;
		
	}
  
  public String getString() throws IOException
  {
	  InputStreamReader isr = new InputStreamReader(System.in);
	  BufferedReader br = new BufferedReader(isr);
	  String s = br.readLine();
	  return s;
  }
  
  
}//end Class

package project;
import collection.Postfix;
import collection.Stack;
import java.io.*;

public class Project22 
{
	
	
	
	public void readfile()
	{
		
		
		
		StringBuffer contents = new StringBuffer();
		BufferedReader reader = null;
		
		try
		{
			reader = new BufferedReader(new FileReader("testing\\Project2Input.txt"));
			
						
				String line = null;
				
		//		Postfix b = new Postfix(line);
				
				while((line = reader.readLine()) != null)
				{
					line.trim();
					
			//		b.evaluate();
					
					contents.append(line).append(System.getProperty("line.separator"));
				//	System.out.println("Original Infix: " + line);
				}
			
		}//end TRY
		
		catch(FileNotFoundException e)
		{
			System.out.println("File Not Found");
		}
		catch(IOException e)
		{
			System.out.println("Something went wrong with reading the file");
		} 
		finally
		{
			try
			{
				if(reader != null)
				{
					reader.close();
				}
			}//end TRY
			catch(IOException e)
			{
				e.printStackTrace();
			}
		}
		System.out.println(contents.toString());

	}
	
	public void writefile()
	{
		PrintWriter writer = null;
		try
		{
			writer = new PrintWriter(new FileWriter(new File("testing\\Project2Output.txt")));
			writer.write("Krysten3");
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
		finally
		{
			writer.close();
						
		}
		
	}
	

	
	public void convert()
	{

		String input = "3+4*5";
		input.trim();
	    String output;
	  
	    Postfix theTrans = new Postfix(input);
	    output = theTrans.doTrans(); 
	    System.out.println("Postfix is " + output + '\n');
	    
	    
	}
	
	
	public void answer()
	{
		String input = "345*+";
		int output;
		
		Postfix eval = new Postfix(input);
	    output = eval.evaluate();
		System.out.println("Result = " + output);
		
	}

	public static void test()
	{
		String input;
		
		Project22 a = new Project22();
			a.readfile();
			a.writefile();
			a.convert();
			a.answer();
		
		
		
	}

}

Recommended Answers

All 14 Replies

i have merged the read & write methods into the test method... i just need to get it to convert to postfix and evaluate the file and write it to a new file all with the test method.

public static void test()
	{
		
	
		
		
		StringBuffer contents = new StringBuffer();
		BufferedReader reader = null;
		PrintWriter writer = null;

		
		try
		{
			reader = new BufferedReader(new FileReader("testing\\Project2Input.txt"));
			writer = new PrintWriter(new FileWriter(new File("testing\\Project2Output.txt")));

			writer.write("Krysten37");

						
				String line = null;
				
				Postfix b = new Postfix(line);
				
				while((line = reader.readLine()) != null)
				{
					line.trim();
					
			//		b.evaluate();
					
					contents.append(line).append(System.getProperty("line.separator"));
				//	System.out.println("Original Infix: " + line);
				}
			
		}//end TRY
		
		catch(FileNotFoundException e)
		{
			System.out.println("File Not Found");
			e.printStackTrace();

		}
		catch(IOException e)
		{
			System.out.println("Something went wrong with reading the file");
			e.printStackTrace();

		} 
		finally
		{
			try
			{
				if(reader != null)
				{
					reader.close();
					writer.close();

				}
			}//end TRY
			catch(IOException e)
			{
				e.printStackTrace();
			}
		}
		System.out.println(contents.toString());
		
		
		}

Check this part of the code:

String line = null;
Postfix b = new Postfix(line);
				
while((line = reader.readLine()) != null) {
	line.trim();
					
	//b.evaluate();	contents.append(line).append(System.getProperty("line.separator"));
}

You have the b.evaluate in comments. But the point is that when you initialize the object you do it outside the while () where the the line is null:

String line = null;
Postfix b = new Postfix(line);

May I suggest that you put it inside the while:

String line = null;

				
while((line = reader.readLine()) != null) {
	line.trim();
        Postfix b = new Postfix(line);	
	//b.evaluate();	contents.append(line).append(System.getProperty("line.separator"));
}

thank you that did fix my problem. I do get my program to write correctly to the text file. Now my problem is that my program cannot evaluate and do the transition from infix and postfix out of the same Stack class because the conversion top needs to be equal to -1.

public Stack(int max) 
    {
      maxSize = max;
      stackArray = new char[maxSize];
      stackArray2 = new int[maxSize];
      top = -1;
    }

And the evaluation top needs to be equal to 0.

public Stack(int max) 
	    {
	      maxSize = max;
	      stackArray = new char[maxSize];
	      stackArray2 = new int[maxSize];
	      top = 0;
	    }

When i run the program i can only get it to run the postfix conversion and i will get the error:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at collection.evalStack.pop2(evalStack.java:43)
at collection.Postfix.evaluate(Postfix.java:103)
at project.Project22.test(Project22.java:149)
at testing.MainTester.main(MainTester.java:18)

But if i change the array index it will still give me an error.

Can you post the implementation of Stack class?

Stack class

package collection;
import java.io.*;

public class Stack 
{
	private int maxSize;
	  
    private char[] stackArray;
    private int[] stackArray2;
  
    private int top;
    private int evaltop;
/**
 * for converting
 * @param max
 */  
    public Stack(int max) 
    {
      maxSize = max;
      stackArray = new char[maxSize];
      stackArray2 = new int[maxSize];
      top = -1;
      evaltop = 0;
    }
    

  
    public void push(char i) 
    {
      stackArray[++top] = i;
    }
    
    public void push2(int j)
    {
    	stackArray2[++evaltop] = j;
    }
  
    public char pop() 
    {
      return stackArray[top--];
    }
    
    public int pop2()
    {
    	return stackArray2[evaltop--];
    }
  
    public char peek() 
    {
      return stackArray[top];
    }
    
    public int peekN(int n)
    {
    	return stackArray[n];
    }
  
    public boolean isEmpty() 
    {
      return (top == -1);
    }
    
    public int size()
    {
    	return top + 1;
    }
    
    public void toString(String s)
    {
    	System.out.print(s);
    	
    	for(int i = 0; i< size(); i++)
    	{
    		System.out.print(peekN(i));
    		System.out.print(' ');
    	}
    	System.out.println(" "); 
    }
  }

Postfix class

package collection;
import java.io.*;


public class Postfix 
{
  private Stack theStack;
  

  private String input;

  private String output = "";

  public Postfix(String in) 
  {
    input = in;
    int stackSize = input.length();
    theStack = new Stack(stackSize);

  }
  
  

  public String doTrans() 
  {
    for (int j = 0; j < input.length(); j++) 
    {
    	input.trim();
      char ch = input.charAt(j);
      switch (ch) {
      case '+': 
      case '-':
        gotOper(ch, 1); 
        break; //   (precedence 1)
      case '*': // it's * or /
      case '/':
      case '%':
        gotOper(ch, 2); // go pop operators
        break; //   (precedence 2)
      case '(': // it's a left paren
        theStack.push(ch); // push it
        break;
      case ')': // it's a right paren
        gotParen(ch); // go pop operators
        break;
      default: // must be an operand
        output = output + ch; // write it to output
        break;
      }
    }
    while (!theStack.isEmpty()) {
      output = output + theStack.pop();

    }
      output.trim();
   // System.out.println(output);
    return output; // return postfix
  }

  public void gotOper(char opThis, int prec1) 
  {
    while (!theStack.isEmpty()) {
      char opTop = theStack.pop();
      if (opTop == '(') {
        theStack.push(opTop);
        break;
      }// it's an operator
      else {// precedence of new op
        int prec2;
        if (opTop == '+' || opTop == '-')
          prec2 = 1;
        else
          prec2 = 2;
        if (prec2 < prec1) // if prec of new op less
        { //    than prec of old
          theStack.push(opTop); // save newly-popped op
          break;
        } else
          // prec of new not less
          output = output + opTop; // than prec of old
      }
    }
    theStack.push(opThis);
  }

  public void gotParen(char ch)
  { 
    while (!theStack.isEmpty()) 
    {
      char chx = theStack.pop();
      if (chx == '(') 
        break; 
      else
        output = output + chx; 
    }
  }
  public int evaluate()
	{
		Stack theStack = new Stack(50);
		int result = 0;
		
		for(int j = 0; j < input.length(); j++)
		{
			char ch = input.charAt(j);
			if(ch >= '0' && ch <= '9')
				theStack.push2((int)(ch- '0'));
			else{
				
				int num2 = theStack.pop2();
				int num1 = theStack.pop2();
			
			
		switch(ch)
		{
	/*	case '0':
		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
		case '8':
		case '9':
			theStack.push((char)(ch - '0'));
			break; */
			
		case '+':
					
			result =  num1 + num2;
			break;
		case '-':
			result = num1 - num2;
			break;
		case '*':
			result = num1 * num2;
			break;
		case '/':
			result = num1 / num2;
			break;
		case '%':
			result = num1 % num2;
			break;
		default:
			result = 0;
		}//end SWITCH
			theStack.push2(result);
			}
	  }//end FOR
			result = theStack.pop2();
			return result;
		
	}
  
  public String getString() throws IOException
  {
	  InputStreamReader isr = new InputStreamReader(System.in);
	  BufferedReader br = new BufferedReader(isr);
	  String s = br.readLine();
	  return s;
  }
  
  
}//end Class

Testing class

package project;
import collection.Postfix;
import collection.Stack;
import collection.evalStack;
import java.io.*;

public class Project22 
{
	
	
	
	public void readfile()
	{
		
		
		
		StringBuffer contents = new StringBuffer();
		BufferedReader reader = null;
		
		try
		{
			reader = new BufferedReader(new FileReader("testing\\Project2Input.txt"));
			
						
				String line = null;
				
		//		Postfix b = new Postfix(line);
				
				while((line = reader.readLine()) != null)
				{
					line.trim();
					
			//		b.evaluate();
					
					contents.append(line).append(System.getProperty("line.separator"));
				//	System.out.println("Original Infix: " + line);
				}
			
		}//end TRY
		
		catch(FileNotFoundException e)
		{
			System.out.println("File Not Found");
		}
		catch(IOException e)
		{
			System.out.println("Something went wrong with reading the file");
		} 
		finally
		{
			try
			{
				if(reader != null)
				{
					reader.close();
				}
			}//end TRY
			catch(IOException e)
			{
				e.printStackTrace();
			}
		}
		System.out.println(contents.toString());

	}
	
	public void writefile()
	{
		PrintWriter writer = null;
		try
		{
			writer = new PrintWriter(new FileWriter(new File("testing\\Project2Output.txt")));
			writer.write("Krysten3");
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
		finally
		{
			writer.close();
						
		}
		
	}
	

	
	public void convert()
	{

		String input = "3+4*5";
		input.trim();
	    String output;
	  
	    Postfix theTrans = new Postfix(input);
	    output = theTrans.doTrans(); 
	    System.out.println("Postfix is " + output + '\n');
	    
	    
	}
	
	
	public void answer()
	{
		String input = "345*+";
		int output;
		
		Postfix eval = new Postfix(input);
	    output = eval.evaluate();
		System.out.println("Result = " + output);
		
	}

	public static void test()
	{
		
		
		
		StringBuffer contents = new StringBuffer();
		BufferedReader reader = null;
		PrintWriter writer = null;

		
		try
		{
			reader = new BufferedReader(new FileReader("testing\\Project2Input.txt"));
			writer = new PrintWriter(new FileWriter(new File("testing\\Project2Output.txt")));


						
				String line = null;
				
				
				
				while((line = reader.readLine()) != null)
				{
					Postfix b = new Postfix(line);
					
					
					
				//	String [] temp = null;
				//	String delimeter = "\\s+";
				//	temp = line.split("\\s+");
					
					//convert to postfix
					String poutput = b.doTrans();
					writer.println();
					
					//convert string to int
				//	int eoutput = Integer.parseInt(poutput);
					
					//evaluate postfix
				//	int eoutput = b.evaluate();
					
					
				//	writer.write(line.trim());
					writer.println("Original Infix: " + line);
					writer.println("Corresponding Postfix: "+ poutput);
					writer.println("Evaluation Result: = ");
					
				//	writer.write(eoutput);
					
			//		contents.append(line).append(System.getProperty("line.separator"));
					
					System.out.println("Original Infix: " +line);
					System.out.println("Corresponding Postfix: " +poutput);
					System.out.println();
				
				}
			
		}//end TRY
		
		catch(FileNotFoundException e)
		{
			System.out.println("File Not Found");
			e.printStackTrace();

		}
		catch(IOException e)
		{
			System.out.println("Something went wrong with reading the file");
			e.printStackTrace();

		} 
		finally
		{
			try
			{
				if(reader != null)
				{
					reader.close();
					writer.close();

				}
			}//end TRY
			catch(IOException e)
			{
				e.printStackTrace();
			}
		}
		System.out.println(contents.toString());
		
		
	}

}
public void push(char i) 
    {
      stackArray[++top] = i;
    }

Before you push anything in the array you need to check if it is full or not. If the maxsize is 10 and you the above 11 times you will get an exception. Try this:

public void push(char i) {
      top++;
      if (top >= stackArray.length()) {
            top--;
      } else {
          stackArray[top] = i;
      }
 }

Also since you put elements into these 2 arrays: stackArray, stackArray2 the same way:

stackArray[++top] = i
stackArray2[++evaltop] = j

You need their indexes to have the same start:

public Stack(int max) 
    {
      maxSize = max;
      stackArray = new char[maxSize];
      stackArray2 = new int[maxSize];
      top = -1;
      evaltop = -1;
    }

I did edit both push methods to check to see if the array is full. But i still get the error:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at collection.Stack.pop2(Stack.java:60)
at collection.Postfix.evaluate(Postfix.java:150)
at project.Project22.test(Project22.java:154)
at testing.MainTester.main(MainTester.java:18)

Because of the error I'm guessing that the pop2() method needs to check to see if it is full or not

public int pop2()
    {
    	
    	if(evaltop >= stackArray2.length)
    	{
    		evaltop++;	
    	} 
    	
    	return stackArray2[evaltop--];
    	
    }

now i get this error:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at collection.Stack.pop2(Stack.java:66)
at collection.Postfix.evaluate(Postfix.java:150)
at project.Project22.test(Project22.java:154)
at testing.MainTester.main(MainTester.java:18)

I don't think my pop2() method is correct so that might be the cause of the error.

java.lang.ArrayIndexOutOfBoundsException: -1

Although I haven't gone through your entire code and neither followed up on the post, The above error strongly suggests that you are performing a Pop operation on an empty stack "stackArray2" (with Head as "evaltop")

I think you may be right I just realized that for the conversion I use stackArray and for evaluation i use stackArray2. I need to figure out how to save the postfix conversion from stackArray and copy it to stackArray2 so that it can evaluated. So it is possible that stackArray2 is empty thats why i get the error when trying to evaluate.

I am having trouble converting the String postfix in stackArray to an int postfix expression for stackArray2.

//convert to postfix
String poutput = b.doTrans();
writer.println();
//convert string to int
int eoutput = Integer.parseInt(poutput);
					
//evaluate postfix
int eoutput = b.evaluate();

it doesn't covert because the string is not in the form " ".

I don't agree with this:

public int pop2()
    {
    	if(evaltop >= stackArray2.length)
    	{
    		evaltop++;	
    	} 
    	return stackArray2[evaltop--];
    }

Why do increase the index when poping? All you need to check is if (evaltop>=0) If yes then you can safely pop (no ArrayIndexOutOfBoundsException because index is -1)
If no then index is -1 so the stack is empty, so don't do anything. There is no point in increasing the index since you don't put anything in the stack. With the pop you only get the element and decrease the index because you removed an element. That is why you need to check if the index is -1 to make sure that the stack has at least 1 item

Also the String.trim() method removes any trailing blank spaces and turn this String: " " into this: ""

I have fixed all the problems for the evaluation... i am now trying to figure out when i come across an invalid postfix expression how do i get it to print out that it is invalid instead of creating an error.

Can anyone help me make it say invalid expression when it tries to change an invalid infix expression to a postfix instead of an error coming up.

Can anyone help me make it say invalid expression when it tries to change an invalid infix expression to a postfix instead of an error coming up.

Can you post again the code where you get the error?

I figured everything thing out i need to put in a try/catch exception

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.