import java.util.Scanner; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintWriter; /*Tiffany Miller * tmm211 * February 20 2008 * The purpose of this program is to define a class that encapsulates the implementation * of a stack, use that stack in the applications of previous assignements, and practice * arrays. */ public class P5 { public static void main(String[] args) { Scanner inputFile = null; PrintWriter outputFile = null; boolean error = false; char operand = ' '; String operation = ""; String line =""; int linecounter= 2; Stack[] Hanoi= new Stack[3]; //The try, catch loops are used to input file hanoi.txt and output //the file to P5.txt. try { inputFile = new Scanner(new FileInputStream("hanoi.txt")); } catch(FileNotFoundException e) { System.out.println("hanoi.txt was not found or could not be opened"); System.exit(0); } try { outputFile = new PrintWriter(new FileOutputStream("P5.txt")); } catch(FileNotFoundException e) { System.out.println("P5.txt could not be opened or created"); System.exit(0); } for( int i = 0; i< Hanoi.length; i++) Hanoi[i] = new Stack(); line= inputFile.nextLine(); Hanoi[0]= new Stack(line); while ((inputFile.hasNextLine()) && (error == false)) { operation = inputFile.next(); inputFile.nextLine(); if(operation.equals("push0")) { if(operand!=' ' && (Hanoi[0].isEmpty() || operand < Hanoi[0].getTop())) { Hanoi[0].push(operand); operand = ' '; } else { outputFile.println("Invalid push at line: " + linecounter +". Letter is too big to be pushed onto stack0"); error = true; } } else if( operation.equals("push1")) { System.out.println(operand + " " + Hanoi[1].toString()); if (operand !=' ' && (Hanoi[1].isEmpty() || operand < Hanoi[1].getTop())) { Hanoi[1].push(operand); operand =' '; } else { outputFile.println("Invalid push at line: " + linecounter + ".The letter to be pushed is too big for stack1"); error = true; } } else if(operation.equals("push2")) { if(operand !=' ' && (Hanoi[2].isEmpty() || operand < Hanoi[2].getTop())) { Hanoi[2].push(operand); operand =' '; } else { outputFile.println("Invalid push at line: " + linecounter + ".The letter to be pushed is too big for stack2"); error = true; } } else if( operation.equals("pop0") && !Hanoi[0].isEmpty()) { Hanoi[0].pop(); } else if( operation.equals("pop1") && !Hanoi[1].isEmpty()) { Hanoi[1].pop(); } else if( operation.equals("pop2")&& !Hanoi[2].isEmpty()) { Hanoi[2].pop(); } else { outputFile.println("Invalid pop at line: " + linecounter + ". Stack is empty"); error= true; } outputFile.println("operand=" + operand); linecounter++; } outputFile.println("Stack0: " + Hanoi[0].toString()); outputFile.println("Stack1: " + Hanoi[1].toString()); outputFile.println("Stack2: " + Hanoi[2].toString()); inputFile.close(); outputFile.close(); } } class Stack { private String stack; public Stack () //constructor creates empty stack { stack = ""; } public Stack (String St) //constructor a stack to its initial contents { stack = St; } public boolean isEmpty () //returns a boolean that says whether there is data in the stack { if(stack.length() == 0) return true; else return false; } public char getTop () // an accessor that returns the char at the top of the stack { char operand; operand = stack.charAt(0); return operand; } public void push (char c) // void method with a char argument that pushes char on stack { stack = c + stack; } public char pop() // does implementation of pop method, returning a char { char temp; temp = stack.charAt(0); stack = stack.substring(1); return temp; } public String toString() //needed for printing stack to file { return stack; } public boolean equals(Stack other) //helps compare two stacks { if(stack.equals(other.stack)) return true; else return false; } }