Revision: 34285
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at October 20, 2010 11:13 by dankauffman
Initial Code
// This program reads a reads and evaluates fully parenthesized Boolean // expressions. The purpose is to illustrate a fundamental use of stacks. import java.util.Stack; import java.util.Scanner; import java.util.regex.Pattern; public class KauffmanW7_LargeProgram05_EvalBoolean { public static void main(String[ ] args) { Scanner stdin = new Scanner(System.in); String expression; boolean answer; // Testing Expressions. expression = "(5>1)"; answer = evaluate(expression); System.out.print("Test01: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is correct."); } else { System.out.println("false, which is WRONG."); } expression = "(5>=1)"; answer = evaluate(expression); System.out.print("Test02: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is correct."); } else { System.out.println("false, which is WRONG."); } expression = "(5<1)"; answer = evaluate(expression); System.out.print("Test03: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is WRONG."); } else { System.out.println("false, which is correct."); } expression = "(5<=1)"; answer = evaluate(expression); System.out.print("Test04: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is WRONG."); } else { System.out.println("false, which is correct."); } expression = "(5==1)"; answer = evaluate(expression); System.out.print("Test05: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is WRONG."); } else { System.out.println("false, which is correct."); } expression = "(5!=1)"; answer = evaluate(expression); System.out.print("Test06: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is correct."); } else { System.out.println("false, which is WRONG."); } expression = "(10 > 5)"; answer = evaluate(expression); System.out.print("Test07: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is correct."); } else { System.out.println("false, which is WRONG."); } expression = "(10 >= 5)"; answer = evaluate(expression); System.out.print("Test08: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is correct."); } else { System.out.println("false, which is WRONG."); } expression = "(10 < 5)"; answer = evaluate(expression); System.out.print("Test09: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is WRONG."); } else { System.out.println("false, which is correct."); } expression = "(10 <= 5)"; answer = evaluate(expression); System.out.print("Test10: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is WRONG."); } else { System.out.println("false, which is correct."); } expression = "(10 == 5)"; answer = evaluate(expression); System.out.print("Test11: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is WRONG."); } else { System.out.println("false, which is correct."); } expression = "(10 != 5)"; answer = evaluate(expression); System.out.print("Test12: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is correct."); } else { System.out.println("false, which is WRONG."); } expression = "((10 > 5) && (10 > 15))"; answer = evaluate(expression); System.out.print("Test13: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is WRONG."); } else { System.out.println("false, which is correct."); } expression = "((10 > 5) || (10 > 15))"; answer = evaluate(expression); System.out.print("Test14: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is correct."); } else { System.out.println("false, which is WRONG."); } expression = "(((10 > 5) && (10 > 15)) || (20 > 15))"; answer = evaluate(expression); System.out.print("Test15: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is correct."); } else { System.out.println("false, which is WRONG."); } expression = "(((10 > 5) || (10 > 15)) && (15 >= 20))"; answer = evaluate(expression); System.out.print("Test16: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is WRONG."); } else { System.out.println("false, which is correct."); } expression = "(!(5<1))"; answer = evaluate(expression); System.out.print("Test17: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is correct."); } else { System.out.println("false, which is WRONG."); } expression = "(!(5>1))"; answer = evaluate(expression); System.out.print("Test18: " + expression + " evaluated as "); if (answer == true) { System.out.println("true, which is WRONG."); } else { System.out.println("false, which is correct."); } answer = query(stdin, "\nWould you like to try some expressions of your own?"); if (!answer) System.exit(0); System.out.println("\nPlease type a Boolean expression made from"); System.out.println("comparison between unsigned numbers, and the"); System.out.println("operations && (AND) and || (OR). The "); System.out.println("expression must be fully parenthesized."); do { System.out.print("Your expression: "); expression = stdin.nextLine( ); try { answer = evaluate(expression); System.out.println("The value is " + answer); } catch (Exception e) { System.out.println("Error." + e.toString( )); } } while (query(stdin, "Another string?")); System.out.println("All numbers are interesting."); } public static boolean query(Scanner input, String prompt) { String answer; System.out.print(prompt + " [Y or N]: "); answer = input.nextLine( ).toUpperCase( ); while (!answer.startsWith("Y") && !answer.startsWith("N")) { System.out.print("Invalid response. Please type Y or N: "); answer = input.nextLine( ).toUpperCase( ); } return answer.startsWith("Y"); } public static boolean evaluate(String s) { // Precondition: The string is a fully parenthesized Boolean expression // formed from non-negative numbers, parentheses, comparisons, and the three // logical operations: !(NOT, unary), && (AND, binary), and || (OR, binary). // Postcondition: The string has been evaluated and the value returned. // Exceptions: Can throw an NumberFormatException if the expression contains // characters other than digits, operations, parentheses and whitespace. // Can throw IllegalArgumentException if the input line is an // illegal expression, such as unbalanced parentheses or an unknown symbol. // KEY //**************** // >= G * // <= L * // != N * // || O * // && A * // == E * //**************** s = s.replace(">=","G"); s = s.replace("<=","L"); s = s.replace("!=","N"); s = s.replace("||","O"); s = s.replace("&&","A"); s = s.replace("==","E"); // System.out.println(s); Scanner input = new Scanner(s); Stack<Integer> numbers = new Stack<Integer>( ); Stack<Character> operations = new Stack<Character>( ); Stack<Boolean> booleans = new Stack<Boolean>( ); String next; char first; while (input.hasNext( )) { if (input.hasNext(UNSIGNED_INT)) { next = input.findInLine(UNSIGNED_INT); numbers.push(new Integer(next)); } else { next = input.findInLine(CHARACTER); first = next.charAt(0); switch (first) { case '>': // Greater Than case 'G': // >= Greater Than or Equal to. case '<': // Less Than case 'L': // Less Than or Equal to. case 'E': // == Equal case 'N': // != Not Equal case '!': // Not case 'A': // && And case 'O': // || Or operations.push(first); break; case ')': // Right parenthesis evaluateStackTops(numbers, operations,booleans); break; case '(': // Left parenthesis break; default : // Illegal character throw new IllegalArgumentException("Illegal character"); } } } if (booleans.size( ) != 1) throw new IllegalArgumentException("Illegal input expression" ); return booleans.pop( ); } public static boolean evalBoolean(int oper1, int oper2, char bool) { switch (bool) { case '>': // Greater Than return (oper1 > oper2); case 'G': // >= Greater Than or Equal to. return (oper1 >= oper2); case '<': // Less Than return (oper1 < oper2); case 'L': // Less Than or Equal to. return (oper1 <= oper2); case 'E': // == Equal return (oper1 == oper2); case 'N': // != Not Equal return (oper1 != oper2); default : // This statement should be unreachable since only the aforementioned values get sent to the method... throw new IllegalArgumentException("Illegal operation"); } } public static void evaluateStackTops(Stack<Integer> numbers, Stack<Character> operations,Stack<Boolean> booleans) { int operand1, operand2; boolean bool1,bool2; if (operations.size( ) < 1) throw new IllegalArgumentException("Illegal expression (Operations Stack Underflow)"); char oper = operations.pop(); switch (oper) { case '>': // Greater Than case 'G': // >= Greater Than or Equal to. case '<': // Less Than case 'L': // Less Than or Equal to. case 'E': // == Equal case 'N': // != Not Equal if (numbers.size( ) < 2) throw new IllegalArgumentException("Illegal expression (Numbers Stack Underflow)"); operand2 = numbers.pop( ); operand1 = numbers.pop( ); booleans.push(evalBoolean(operand1,operand2,oper)); break; case '!': if (booleans.size( ) < 1) throw new IllegalArgumentException("Illegal expression (Booleans Stack Underflow)"); booleans.push (!(booleans.pop( ))); break; case 'A': case 'O': if (booleans.size( ) < 2) throw new IllegalArgumentException("Illegal expression (Booleans Stack Underflow)"); bool2 = booleans.pop( ); bool1 = booleans.pop( ); if (oper == 'A') booleans.push ( (bool1 && bool2)); else booleans.push ( (bool1 || bool2)); break; default : throw new IllegalArgumentException("Illegal operation (Unknown Character)"); } } // These patterns are from Appendix B of Data Structures and Other Objects. // They may be used in hasNext and findInLine to read certain patterns // from a Scanner. public static final Pattern CHARACTER = Pattern.compile("\\S.*?"); public static final Pattern UNSIGNED_INT = Pattern.compile("\\d+.*?"); }
Initial URL
Initial Description
An [example][id]. Then, **anywhere** else in the doc, define the link: [id]: http://example.com/ "Title"
Initial Title
Evaluating Parenthesized Boolean Expressions (Using Stacks)
Initial Tags
java
Initial Language
Java