1.44k likes | 1.53k Views
This chapter explores the implementation and applications of stacks in Java, including the use of the standard Stack class. It demonstrates how to push and pop elements from a stack and showcases a longer demonstration of Java's Stack class.
E N D
Chapter 13: Stacks and Queues Stacks Applications of Stacks Implementation of a Stack Class Queues Implementation of the Queue Class Simulation
Stacks • Common in real world • Papers • Books • CDs • Plates • Bowls • What can we do with a stack? • Put new item on top • Take topmost item off Programming and Problem Solving With Java
Stacks: Operations • Java has a standard Stack class • java.util.Stack • Methods: • push(): put a new item on top of a stack • pop(): get the topmost item from the stack, and remove it from the stack • peek(): get the value of the topmost item from the stack, but don't remove the item from the stack • empty(): return true if the stack is empty • search(): tell how far a value is from the top of the stack, or -1 if the value is not in the stack • A stack is a LIFO structure • Last-in, first-out Programming and Problem Solving With Java
Stacks: Push and Pop Programming and Problem Solving With Java
Stacks: Demonstration • // This program is a simple demonstration of how to • // use Java's standard Stack class. • import java.util.Stack; • public class SimpleStackDemo • { • public static void main(String[] args) • throws java.io.IOException • { • Stack myStack = new Stack(); • // Push some values on the stack (all must be objects) • myStack.push("Hello"); • myStack.push(new Integer(123)); • myStack.push(new Double(5.678)); • // Display the stack • System.out.println("The contents of the stack: " + myStack); • // Pop the objects off the stack and display them • double dValue = ((Double) myStack.pop()).doubleValue(); • System.out.println("Popped " + dValue); • int iValue = ((Integer) myStack.pop()).intValue(); • System.out.println("Popped " + iValue); • String sValue = (String) myStack.pop(); • System.out.println("Popped " + sValue); • // Display the stack • System.out.println("The contents of the stack: " + myStack); • } • } The contents of the stack: [Hello, 123, 5.678] Popped 5.678 Popped 123 Popped Hello The contents of the stack: [] Programming and Problem Solving With Java
Stacks: Demonstration • Longer demonstration of Java’s Stack class • // This program lets you push characters onto the • // stack, and pop them off. It makes sure you don't try to pop • // a character from an empty stack. This is a demonstration of • // how to use the Stack class. • import java.util.Stack; • import TextMenu; • import Keyboard; • public class StackDemoApp extends TextMenu • { • static final int PUSH_COMMAND = 1; • static final int POP_COMMAND = 2; • static final int TOP_COMMAND = 3; • // Constructor • public StackDemoApp() • { • super("Stack Test Menu"); • addSelection("Push a new element", '1', PUSH_COMMAND); • addSelection("Pop an element", '2', POP_COMMAND); • addSelection("Get topmost element", '3', TOP_COMMAND); • addSelection("Quit program", 'q', TextMenu.QUIT); • } Programming and Problem Solving With Java
Stacks: Demonstration • StackDemoApp (continued) • // Handle each event as user selects a command • public int handleEvent(int event) • throws java.io.IOException • { • char character; • switch (event) • { • case PUSH_COMMAND: • character = Keyboard.readChar("Character to push: "); • charStack.push(new Character(character)); • break; • case POP_COMMAND: • if (charStack.empty()) • { • System.out.println("Stack is empty"); • } • else • { • character = ((Character) charStack.pop()).charValue(); • System.out.println("Character popped: " + character); • } • break; • case TOP_COMMAND: • if (charStack.empty()) • { • System.out.println("Stack is empty"); • } • else • { • character = ((Character) charStack.peek()).charValue(); • System.out.println("Character on top: " + character); • } • break; • } • return event; • } Programming and Problem Solving With Java
Stacks: Demonstration • StackDemoApp (continued) • // Instance variables • private Stack charStack = new Stack(); • public static void main(String[] args) • throws java.io.IOException • { • StackDemoApp stackDemo = new StackDemoApp(); • stackDemo.run(); • } • } Programming and Problem Solving With Java
Stacks: Demonstration • StackDemoApp (sample run) • +--- Stack Test Menu --- • | 1) Push a new element 2) Pop an element 3) Get topmost element • | q) Quit program • | Enter selection: 1 • Character to push: X • +--- Stack Test Menu --- • | 1) Push a new element 2) Pop an element 3) Get topmost element • | q) Quit program • | Enter selection: 1 • Character to push: Y • +--- Stack Test Menu --- • | 1) Push a new element 2) Pop an element 3) Get topmost element • | q) Quit program • | Enter selection: 2 • Character popped: Y • +--- Stack Test Menu --- • | 1) Push a new element 2) Pop an element 3) Get topmost element • | q) Quit program • | Enter selection: 2 • Character popped: X • +--- Stack Test Menu --- • | 1) Push a new element 2) Pop an element 3) Get topmost element • | q) Quit program • | Enter selection: q Programming and Problem Solving With Java
Stacks: Postfix Expressions • Postfix notation • Also called reverse Polish notation (RPN) • Enter operator after operands • Example: 6+8 is 6 8 + in Postfix • Infix notation • Conventional notation: 6 + 8 • Advantages of postfix • Parentheses not needed (8 + 7) x (2 - 8) 8 7 + 2 8 - x • Easy to evaluate by computer Programming and Problem Solving With Java
Stacks: Postfix Expressions • Evaluation of postfix expression • Get symbol from expression • If symbol is number, push on stack • If symbol is operator, pop two numbers from stack, do operation, push result back onto stack • Repeat until all symbols read from expression. At end, result is on top of stack Programming and Problem Solving With Java
Example Evaluate 6 8 + Stacks: Postfix Expressions Programming and Problem Solving With Java
Stacks: Postfix Expressions • Example: Program to evaluate postfix expressions • Single digit numbers only • No spaces • No error checking • // This program evaluates postfix expressions. The • // operators +, -, *, and /. This program does NO error checking. • import java.util.Stack; • import Keyboard; • public class EvaluatePostFix • { Programming and Problem Solving With Java
Stacks: Postfix Expressions • // doOperation: Returns firstOperand oper secondOperand • // Note: oper must be '+', '-', '*', or '/'. If oper is '/', • // then secondOperand cannot be zero • static int doOperation(int firstOperand, int secondOperand, • char oper) • { • int returnValue = 0; • switch (oper) • { • case '+': • returnValue = firstOperand + secondOperand; • break; • case '-': • returnValue = firstOperand - secondOperand; • break; • case '*': • returnValue = firstOperand * secondOperand; • break; • case '/': • returnValue = firstOperand / secondOperand; • break; • } • return returnValue; • } Programming and Problem Solving With Java
Stacks: Postfix Expressions • public static void main(String[] args) • throws java.io.IOException • { • Stack stack = new Stack(); • char inputChar; • System.out.println("--- Evaluate postfix expressions ---"); • System.out.println("--- (Single digit integers ONLY) ---"); • System.out.println(); • String expression • = Keyboard.readString("Enter a postfix expression: "); Programming and Problem Solving With Java
Stacks: Postfix Expressions • for (int pos = 0; pos < expression.length(); pos++) • { • inputChar = expression.charAt(pos); • System.out.println(); • System.out.println("Next character is " + inputChar • + ", stack is " + stack); • switch (inputChar) • { • case '0': case '1': case '2': case '3': case '4': • case '5': case '6': case '7': case '8': case '9': • System.out.println(" Push " + inputChar); • stack.push(new Integer(Character.digit(inputChar, 10))); • break; • case '+': case '-': case '*': case '/': • int firstOperand = ((Integer) stack.pop()).intValue(); • System.out.println(" Pop " + firstOperand); • int secondOperand = ((Integer) stack.pop()).intValue(); • System.out.println(" Pop " + secondOperand); • int result = doOperation(secondOperand, firstOperand, • inputChar); • System.out.println(" Compute " + secondOperand • + " " + inputChar + " " • + firstOperand • + " and push result " + result); • stack.push(new Integer(result)); • break; • case ' ': • break; // Do nothing • } • } • System.out.println(" Pop result " + stack.pop()); • } • } (Debugging statements in blue) Programming and Problem Solving With Java
Stacks: Postfix Expressions • Sample run of EvaluatePostFix: 6 8 + • --- Evaluate postfix expressions --- • --- (Single digit integers ONLY) --- • Enter a postfix expression: 6 8 + • Next character is 6, stack is [] • Push 6 • Next character is , stack is [6] • Next character is 8, stack is [6] • Push 8 • Next character is , stack is [6, 8] • Next character is +, stack is [6, 8] • Pop 8 • Pop 6 • Compute 6 + 8 and push result 14 • Pop result 14 Programming and Problem Solving With Java
Stacks: Postfix Expressions • Another evaluation: 8 7 + 2 8 - x --- Evaluate postfix expressions --- --- (Single digit integers ONLY) --- Enter a postfix expression: 8 7 + 2 8 - * Next character is 8, stack is [] Push 8 Next character is , stack is [8] Next character is 7, stack is [8] Push 7 Next character is , stack is [8, 7] Next character is +, stack is [8, 7] Pop 7 Pop 8 Compute 8 + 7 and push result 15 Next character is , stack is [15] Next character is 2, stack is [15] Push 2 Next character is , stack is [15, 2] Next character is 8, stack is [15, 2] Push 8 Next character is , stack is [15, 2, 8] Next character is -, stack is [15, 2, 8] Pop 8 Pop 2 Compute 2 - 8 and push result -6 Next character is , stack is [15, -6] Next character is *, stack is [15, -6] Pop -6 Pop 15 Compute 15 * -6 and push result -90 Programming and Problem Solving With Java
Stacks: Translate Infix to Postfix • Translation of infix to postfix • If we can translate expression to postfix, then can use EvalPostfix to evaluate • Can use a stack to convert infix to postfix • Will require fully parenthesized infix expressions • Fully parenthesized: parentheses for each operator • Example: (1 + (8 x 2)) • Not fully parenthsized: ((9 + 3 - 2) / 5) • Keeps translation algorithm simple Programming and Problem Solving With Java
Stacks: Translate Infix to Postfix • Translation of infix to postfix by hand Programming and Problem Solving With Java
Stacks: Translate Infix to Postfix • Algorithm to translate infix to postfix • For each input character • If character is operand, output character • If character is operator, push character on stack • If character is right parenthesis, pop operator and output operator • If character is left parenthesis, ignore • Resulting output is postfix equivalent of infix expression Programming and Problem Solving With Java
Stacks: Translate Infix to Postfix • Example: translate (1 + (8 * 2)) Programming and Problem Solving With Java
Stacks: Activation Records • Computer uses run-time stack • Each running method has activation record on the stack • Keeps track of method calls and returns • Each method’s activation record contains • Return point • Local variable values • Parameter values • Stack works well here • if A calls B, then B must finish before A can resume • Last-in, first-out stack Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • Example: Simple programming language DPL • No parameters • No variables • No return values • Basically just method calls • DPL statements • COMMENT: ignored • TYPE: display argument • END: end program (ends automatically if no more statements) • METHOD: Begin method definition • RETURN: Return from method • CALL: Call method Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • Control starts with first statement (ignores COMMENT) • First statement should be TYPE, END, or CALL • Example DPL program • CALL SomeMethod • TYPE Finished! • END • METHOD SomeMethod • TYPE Now in SomeMethod • RETURN • Output • Now in SomeMethod • Finished! • Next slide shows activation records on run-time stack for this program Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • COMMENT This is an example of the • COMMENT demonstration programming language DPL. • COMMENT It shows how methods work. • COMMENT ---- Main program ---- • TYPE >> Starting main program • TYPE -- Call FirstMethod from main ... • CALL FirstMethod • TYPE -- Back in main from FirstMethod • TYPE -- Call SecondMethod from main ... • CALL SecondMethod • TYPE -- Back in main from SecondMethod • TYPE << Ending main program • END • METHOD FirstMethod • TYPE >> Entering FirstMethod • TYPE << Leaving FirstMethod • RETURN • METHOD SecondMethod • TYPE >> Entering SecondMethod • TYPE -- Call FirstMethod from SecondMethod ... • CALL FirstMethod • TYPE -- Back in SecondMethod from FirstMethod • TYPE << Leaving SeconMMdMethod • RETURN >> Starting main program -- Call FirstMethod from main ... >> Entering FirstMethod << Leaving FirstMethod -- Back in main from FirstMethod -- Call SecondMethod from main ... >> Entering SecondMethod -- Call FirstMethod from SecondMethod ... >> Entering FirstMethod << Leaving FirstMethod -- Back in SecondMethod from FirstMethod << Leaving SecondMethod -- Back in main from SecondMethod << Ending main program Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • DPL interpreter logic • Read program from file into memory • Set program counter to first statement • While haven't reached END statement or past end • If TYPE: display the argument • If CALL: push address of CALL statement, set program counter to address of METHOD statement • If RETURN: pop program counter • If COMMENT or blank line: ignore line • If METHOD: error • Increment program counter Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • Error if control reaches METHOD statement • TYPE The next statement should give a run-time error • METHOD Wrong • TYPE Control shouldn't reach here! • RETURN • Output • $ java TestDPL test1.dpl • The next statement should give a run-time error • Error: METHOD without CALL • 2: METHOD Wrong • Program halted Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • // This program implements an interpreter for a • // small demonstration programming language (DPL). Each line • // in DPL is a statement. Each statement begins with a keyword • // and may be followed by an argument. The statements are: • // COMMENT: Line is ignored by the interpreter. • // TYPE: Display the argument (rest of the line) on the • // screen. • // END: End the program. The program ends automatically • // if there are no more statements. • // METHOD: Begin a method definition. The name follows. • // RETURN: Return from a method. Each method must have • // a RETURN statement. • // CALL: Call a method by name. • // DPL is case insensitive, and allows blank lines. • import java.io.*; • import java.util.Stack; • // ----------------- DPLstatement class ------------------ • class DPLstatement • { • static final int TYPE_COMMAND = 1; • static final int END_COMMAND = 2; • static final int METHOD_COMMAND = 3; • static final int RETURN_COMMAND = 4; • static final int CALL_COMMAND = 5; • static final int COMMENT_COMMAND = 6; • static final int BLANK_LINE = 7; • static final int UNKNOWN_COMMAND = 8; DPL Interpreter (TestDPL.java) Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • // Constructor: Converts a program line into an internal form • public DPLstatement(String line) • { • String commandString; • // Remove blanks on both ends of line • line = line.trim(); • // Look for first blank (separates command from argument) • int blankLoc = line.indexOf(" "); • // Separate command from argument • if (blankLoc == -1) • { • commandString = line.toUpperCase(); • } • else • { • commandString • = line.substring(0, blankLoc).toUpperCase(); • argument = line.substring(blankLoc + 1).trim(); • } DPL Interpreter (TestDPL.java) Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • // Convert command to internal form • if (commandString.equals("TYPE")) • { • command = TYPE_COMMAND; • } • else if (commandString.equals("END")) • { • command = END_COMMAND; • } • else if (commandString.equals("METHOD")) • { • command = METHOD_COMMAND; • } • else if (commandString.equals("RETURN")) • { • command = RETURN_COMMAND; • } • else if (commandString.equals("CALL")) • { • command = CALL_COMMAND; • } • else if (commandString.equals("COMMENT")) • { • command = COMMENT_COMMAND; • } • else if (commandString.trim().equals("")) • { • command = BLANK_LINE; • } • else • { • command = UNKNOWN_COMMAND; • argument = line; • } • } DPL Interpreter (TestDPL.java) Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • // getCommand: Returns the command as an integer • public int getCommand() • { • return command; • } • // getArgument: Returns the argument as a string (null if no • // argument) • public String getArgument() • { • return argument; • } DPL Interpreter (TestDPL.java) Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • // toString: Returns the statement as a string (for error • // messages) • public String toString() • { • String result = ""; • switch (command) • { • case TYPE_COMMAND: result = "TYPE "; break; • case END_COMMAND: result = "END"; break; • case METHOD_COMMAND: result = "METHOD "; break; • case RETURN_COMMAND: result = "RETURN"; break; • case CALL_COMMAND: result = "CALL "; break; • case COMMENT_COMMAND: result = "COMMENT "; break; • case BLANK_LINE: result = ""; break; • case UNKNOWN_COMMAND: result = ""; break; • } • if (argument != null) • { • result = result + argument; • } • return result; • } • private int command; • private String argument; • } DPL Interpreter (TestDPL.java) Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • // ----------------- DPL class ------------------ • class DPL • { • static final int MAX_STATEMENTS = 100; // Maximum number of • // statements in • // a program • // Constructor: Reads the program from the given file, returns • // true if successful • public DPL(String fileName) • throws java.io.IOException • { • String line; • // Initialize the input file variable • File inFile = new File(fileName); • if (inFile.exists() && inFile.canRead()) • { • // Create an input stream and attach it to the file • BufferedReader fileInStream • = new BufferedReader(new FileReader(inFile)); DPL Interpreter (TestDPL.java) Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • // Read lines from the file into the array • line = fileInStream.readLine(); • while (numStatements < statement.length • && line != null) • { • statement[numStatements] • = new DPLstatement(line); • numStatements++; • line = fileInStream.readLine(); • } • // Make sure all lines were read • if (line != null) • { • error("Too many statements"); • } • // Close the stream • fileInStream.close(); • } • else • { • // Can't open input file • error("Can't open input file " + fileName); • } • } DPL Interpreter (TestDPL.java) Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • // interpretProgram: Interprets the statements of the program • public void interpretProgram() • { • Stack runTimeStack = new Stack(); • boolean stop = false; • String argument; • // Step through the program, executing statements • while (programCounter < numStatements && !stop) • { • switch (statement[programCounter].getCommand()) • { • case DPLstatement.TYPE_COMMAND: • argument • = statement[programCounter].getArgument(); • if (argument == null) • { • argument = ""; • } • System.out.println(argument); • break; • case DPLstatement.END_COMMAND: • stop = true; • break; • case DPLstatement.METHOD_COMMAND: • error("METHOD without CALL"); • break; DPL Interpreter (TestDPL.java) Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • case DPLstatement.RETURN_COMMAND: • if (runTimeStack.empty()) • { • error("RETURN command without CALL"); • } • else • { • programCounter • = ((Integer) runTimeStack.pop()).intValue(); • } • break; • case DPLstatement.CALL_COMMAND: • runTimeStack.push(new Integer(programCounter)); • programCounter • = findMethod(statement • [programCounter].getArgument()); • break; • case DPLstatement.COMMENT_COMMAND: • case DPLstatement.BLANK_LINE: • // Do nothing • break; • case DPLstatement.UNKNOWN_COMMAND: • error("Unknown command"); • break; • } • programCounter++; • } • } DPL Interpreter (TestDPL.java) Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • // findMethod: Returns the location of the METHOD command • // with the given name • private int findMethod(String methodName) • { • methodName.toUpperCase(); • for (int position = 0; • position < numStatements; • position++) • { • if (statement[position].getCommand() • == DPLstatement.METHOD_COMMAND • && statement[position].getArgument(). • equals(methodName)) • { • return position; • } • } • error("Undefined METHOD " + methodName); • return 0; • } DPL Interpreter (TestDPL.java) Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • // error: Displays the error message and halts the program • private void error(String message) • { • System.out.println("Error: " + message); • if (statement[programCounter] != null) • { • System.out.println((programCounter + 1) + ": " • + statement[programCounter]); • } • System.out.println("Program halted"); • System.exit(2); • } • // Instance variables • DPLstatement[] statement = new DPLstatement[MAX_STATEMENTS]; • int programCounter = 0, numStatements = 0; • } DPL Interpreter (TestDPL.java) Programming and Problem Solving With Java
Stacks: Activation Records (DPL) • // ----------------- TestDPL class ------------------ • public class TestDPL • { • public static void main(String[] args) • throws java.io.IOException • { • DPL program = new DPL(args[0]); • program.interpretProgram(); • } • } DPL Interpreter (TestDPL.java) Programming and Problem Solving With Java
Stacks: Activation Records (DPL2) • DPL2: Add a LOOP statement to DPL • Syntax • LOOP • ... • ASK x • ... • AGAIN • LOOP -- marks the top of the loop • ASK x -- user enters character, if it matches x, control goes to statement after AGAIN, otherwise statement after ASK • AGAIN -- jump to LOOP Programming and Problem Solving With Java
Loop statement example LOOP TYPE What's 4 + 5? ASK 9 TYPE No, try again. AGAIN TYPE That's right! Output What's 4 + 5? 8 No, try again. What's 4 + 5? 9 That's right! Nested loop example LOOP TYPE Enter the number 1 ASK 1 LOOP TYPE Do you know your numbers? (y/n) ASK y TYPE A number is between 0 and 9 AGAIN AGAIN TYPE Correct! Output Enter the number 1 X Do you know your numbers? (y/n) n A number is between 0 and 9 Do you know your numbers? (y/n) y Enter the number 1 1 Correct! Stacks: Activation Records (DPL2) Programming and Problem Solving With Java
Stacks: Activation Records (DPL2) • More realistic example of DPL2 (capitals.dpl) • COMMENT This is an example of the second version • COMMENT of the demonstration programming language. This • COMMENT version has loops of the form LOOP ... ASK ... AGAIN. • CALL Introduction • LOOP • CALL USAcapital • CALL NewZealandCapital • CALL GreatBritainCapital • CALL AustraliaCapital • TYPE Do you want to take this quiz again (y/n)? • ASK n • AGAIN • TYPE Bye! • END • METHOD Introduction • TYPE This is a quiz that tests your knowledge of country • TYPE capitals. • TYPE Here is the first question ... • TYPE • RETURN Programming and Problem Solving With Java
Stacks: Activation Records (DPL2) • METHOD AustraliaCapital • LOOP • TYPE What is the capital city of Australia? • TYPE 1. Canberra • TYPE 2. London • TYPE 3. Washington, DC • TYPE 4. Wellington • ASK 1 • TYPE Hint: The design of the capital of Australia won an • TYPE international competition in 1911. • AGAIN • RETURN • METHOD GreatBritainCapital • LOOP • TYPE What is the capital city of Great Britain? • TYPE 1. Canberra • TYPE 2. London • TYPE 3. Washington, DC • TYPE 4. Wellington • ASK 2 • TYPE Hint: The capital of Great Britain is on both sides • TYPE of the Thames River. • AGAIN • RETURN Programming and Problem Solving With Java
Stacks: Activation Records (DPL2) • METHOD NewZealandCapital • LOOP • TYPE What is the capital city of New Zealand? • TYPE 1. Canberra • TYPE 2. London • TYPE 3. Washington, DC • TYPE 4. Wellington • ASK 4 • TYPE Hint: The capital of New Zealand is at the southern tip of • TYPE Cook Strait. • AGAIN • RETURN • METHOD USAcapital • LOOP • TYPE What is the capital city of the United States of America? • TYPE 1. Canberra • TYPE 2. London • TYPE 3. Washington, DC • TYPE 4. Wellington • ASK 3 • TYPE Hint: The capital of the United States of America was named • TYPE after it's first president. • AGAIN • RETURN Programming and Problem Solving With Java
Stacks: Activation Records (DPL2) • Sample run of capitals.dpl • This is a quiz that tests your knowledge of country • capitals. • Here is the first question ... • What is the capital city of the United States of America? • 1. Canberra • 2. London • 3. Washington, DC • 4. Wellington • 2 • Hint: The capital of the United States of America was named • after it's first president. • What is the capital city of the United States of America? • 1. Canberra • 2. London • 3. Washington, DC • 4. Wellington • 3 Programming and Problem Solving With Java
Stacks: Activation Records (DPL2) • Sample run of capitals.dpl (continued) • What is the capital city of New Zealand? • 1. Canberra • 2. London • 3. Washington, DC • 4. Wellington • 4 • What is the capital city of Great Britain? • 1. Canberra • 2. London • 3. Washington, DC • 4. Wellington • 2 • What is the capital city of Australia? • 1. Canberra • 2. London • 3. Washington, DC • 4. Wellington • 1 • Do you want to take this quiz again (y/n)? • n • Bye! Programming and Problem Solving With Java
Stacks: Activation Records (DPL2) • // This program implements DPL2. It extends the DPL • // small demonstration programming language (DPL). Each line • // in DPL is a statement. Each statement begins with a keyword • // and may be followed by an argument. The statements are: • // COMMENT: Line is ignored by the interpreter. • // TYPE: Display the argument (rest of the line) on the • // screen. • // END: End the program. The program ends automatically • // if there are no more statements. • // METHOD: Begin a method definition. The name follows. • // RETURN: Return from a method. Each method must have • // a RETURN statement. • // CALL: Call a method by name. • // LOOP ... ASK ... AGAIN: • // The LOOP command begins a loop. The ASK command • // asks the user for a response, and compares it to • // the single character argument. If equal, control • // continues with the statement following AGAIN. If • // not equal, control continues with the statement • // following ASK. When control reaches the AGAIN • // command, it continues with the statement following • // the associated LOOP command. • // DPL2 is case insensitive, and allows blank lines. DPL2 Interpreter (TestDPL2.java) Programming and Problem Solving With Java
Stacks: Activation Records (DPL2) • import Keyboard; • import java.io.*; • import java.util.Stack; • // ----------------- DPLstatement class ------------------ • class DPLstatement • { • static final int TYPE_COMMAND = 1; • static final int END_COMMAND = 2; • static final int METHOD_COMMAND = 3; • static final int RETURN_COMMAND = 4; • static final int CALL_COMMAND = 5; • static final int COMMENT_COMMAND = 6; • static final int BLANK_LINE = 7; • static final int UNKNOWN_COMMAND = 8; • static final int LOOP_COMMAND = 9; • static final int ASK_COMMAND = 10; • static final int AGAIN_COMMAND = 11; DPL2 Interpreter (TestDPL2.java) Programming and Problem Solving With Java