Question

In: Computer Science

Assign a new alphabet whenever it sees a new number in those expressions ( Use increment...

Assign a new alphabet whenever it sees a new number in those expressions ( Use increment operator(++) so, lets say if x = "a", then x++ would be "b" and so on for as many numbers are there in expressions)

Assignment:Consider the input file “p4in.txt”has the following contents (in java language)
(Assuming that all expressions are correct): so using the valueStack ,uses ArrayStack and operatorStack

Specifications:

1) You must implement ArrayStack.java and modify Positfix.java so that valueStack uses ArrayStack and operatorStack uses LinkedStack.

2) Do this program step by step.

3) It may be easier to use String to split the expression to obtain the array of values.

4) Build your symbol table using single-letter variable name that starts from ‘a’.

Here is the inputfile (p4in.txt)
2 + 3
(2+ 3) * 4
2 * 3 / (4 -5)
2 / 3 + (4 -5)
2 / 3 + c -d
2 ^ 3 ^ 4
(2 ^ 3) ^ 4
2 * (3 / 4 + 5)
(2 + 3) / (4 -5)
2 / (3 -4) * 5
2 - (3 / (4 - 5) * 6 + 0) ^ 1
(2 - 3 * 4) / (5 * 6 ^ 0) * 1 + 8


I need to produce the output file named “p4out.txt” similar to the following:

Here is the output sample p4out.txt
Symbol Table
Variable     Value
a              2
b              3
c              4
d              5
e              6
f              0
g              1
h              8

Input                           Infix    Postfix   Result
2 + 3                           a+b       ab+       5
(2+ 3) * 4                      (a+b)*c   ab+c*    20
2 * 3 / (4 -5)                 all value Omitted downhere
2 / 3 + (4 -5)
2 / 3 + c -d
2 ^ 3 ^ 4
(2 ^ 3) ^ 4
2 * (3 / 4 + 5)
(2 + 3) / (4 -5)
2 / (3 -4) * 5
2 - (3 / (4 - 5) * 6 + 0) ^ 1
(2 - 3 * 4) / (5 * 6 ^ 0) * 1 + 8

Required programs:

ArrayStack.java:

import java.util.Arrays;
import java.util.EmptyStackException;
/**
    A class of stacks whose entries are stored in an array.
    @author Frank M. Carrano
    @author Timothy M. Henry
    @version 4.0
*/
public final class ArrayStack<T> implements StackInterface<T>
{
        private T[] stack;    // Array of stack entries
        private int topIndex; // Index of top entry
   private boolean initialized = false;
        private static final int DEFAULT_CAPACITY = 50;
        private static final int MAX_CAPACITY = 10000;
        
        public ArrayStack()
        {
      this(DEFAULT_CAPACITY);
        } // end default constructor
        
        public ArrayStack(int initialCapacity)
        {
      checkCapacity(initialCapacity);
      
      // The cast is safe because the new array contains null entries
      @SuppressWarnings("unchecked")
      T[] tempStack = (T[])new Object[initialCapacity];
      stack = tempStack;
                topIndex = -1;
      initialized = true;
        } // end constructor

        public void push(T newEntry)
        {
                checkInitialization();
                ensureCapacity();
                stack[topIndex + 1] = newEntry;
                topIndex++;
        } // end push

        public T peek()
        {
                checkInitialization();
                if (isEmpty())
                        throw new EmptyStackException();
                else
         return stack[topIndex];
        } // end peek

        public T pop()
        {
                checkInitialization();
                if (isEmpty())
                        throw new EmptyStackException();
                else
                {
                        T top = stack[topIndex];
                        stack[topIndex] = null;
                        topIndex--; 
         return top;
                } // end if
   } // end pop

   public boolean isEmpty()
        {
                return topIndex < 0;
        } // end isEmpty
        
        public void clear()
        {
                checkInitialization();
      
      // Remove references to the objects in the stack,
      // but do not deallocate the array
                while (topIndex > -1)
      {
                        stack[topIndex] = null;
         topIndex--;
      } // end while
      //        Assertion: topIndex is -1       
        } // end clear
   
   // Throws an exception if this object is not initialized.
   private void checkInitialization()
   {
      if (!initialized)
         throw new SecurityException ("ArrayStack object is not initialized properly.");
   } // end checkInitialization
   
   // Throws an exception if the client requests a capacity that is too large.
   private void checkCapacity(int capacity)
   {
      if (capacity > MAX_CAPACITY)
         throw new IllegalStateException("Attempt to create a stack " +
                                         "whose capacity exceeds " +
                                         "allowed maximum.");
   } // end checkCapacity
    
   // Doubles the size of the array stack if it is full
   // Precondition: checkInitialization has been called.
        private void ensureCapacity()
        {
           if (topIndex >= stack.length - 1) // If array is full, double its size
      {
         int newLength = 2 * stack.length;
         checkCapacity(newLength);
         stack = Arrays.copyOf(stack, newLength);
      } // end if
        } // end ensureCapacity
} // end ArrayStack

LinkedStack.java:

import java.util.EmptyStackException;
/**
   A class of stacks whose entries are stored in a chain of nodes.
   
   @author Frank M. Carrano
   @author Timothy M. Henry
   @version 4.0
*/
public final class LinkedStack<T> implements StackInterface<T>
{
        private Node topNode; // References the first node in the chain
        
        public LinkedStack()
        {
                topNode = null;
        } // end default constructor
        
        public void push(T newEntry)
        {
      topNode = new Node(newEntry, topNode);
//              Node newNode = new Node(newEntry, topNode);
//              topNode = newNode;
        } // end push

        public T peek()
        {
                if (isEmpty())
                        throw new EmptyStackException();
                else
         return topNode.getData();
        } // end peek

        public T pop()
        {
           T top = peek();  // Might throw EmptyStackException
           assert (topNode != null);
      topNode = topNode.getNextNode(); 

           return top;
        } // end pop

/*
// Question 1, Chapter 6: Does not call peek 
        public T pop()
        {
      if (isEmpty())
         throw new EmptyStackException();
      else
                {
         assert (topNode != null);
                        top = topNode.getData();
                        topNode = topNode.getNextNode();
                } // end if
                
                return top;
        } // end pop
*/              

        public boolean isEmpty()
        {
                return topNode == null;
        } // end isEmpty
        
        public void clear()
        {
                topNode = null;  // Causes deallocation of nodes in the chain
        } // end clear

        private class Node
        {
      private T    data; // Entry in stack
      private Node next; // Link to next node

      private Node(T dataPortion)
      {
         this(dataPortion, null);
      } // end constructor

      private Node(T dataPortion, Node linkPortion)
      {
         data = dataPortion;
         next = linkPortion;    
      } // end constructor

      private T getData()
      {
         return data;
      } // end getData

      private void setData(T newData)
      {
         data = newData;
      } // end setData

      private Node getNextNode()
      {
         return next;
      } // end getNextNode

      private void setNextNode(Node nextNode)
      {
         next = nextNode;
      } // end setNextNode
        } // end Node
} // end LinkedStack

Postfix.java:

/**
   A class that represents a postfix expression.
   Based on pseudocode in Segments 5.16 and 5.18.

   @author Frank M. Carrano
   @author Timothy M. Henry
   @version 4.0
*/
public class Postfix
{
   /** Creates a postfix expression that represents a given infix expression.
       Segment 5.16.
       @param infix  A string that is a valid infix expression.
       @return  A string that is the postfix expression equivalent to infix. */
   public static String convertToPostfix(String infix)
   {
      StackInterface<Character> operatorStack = new LinkedStack<Character>();
      StringBuilder postfix = new StringBuilder();
      int characterCount = infix.length();
      char topOperator;

      for (int index = 0; index < characterCount; index++)
      {
         boolean done = false;
         char nextCharacter = infix.charAt(index);

         if (isVariable(nextCharacter))
            postfix = postfix.append(nextCharacter);
         else
         {
            switch (nextCharacter)
            {
               case '^':
                  operatorStack.push(nextCharacter);
                  break;

               case '+': case '-': case '*': case '/':
                  while (!done && !operatorStack.isEmpty())
                  {
                     topOperator = operatorStack.peek();

                     if (getPrecedence(nextCharacter) <= getPrecedence(topOperator))
                     {
                        postfix = postfix.append(topOperator);
                        operatorStack.pop();
                     }
                     else
                        done = true;
                  } // end while

                  operatorStack.push(nextCharacter);
                  break;

               case '(':
                  operatorStack.push(nextCharacter);
               break;

               case ')': // Stack is not empty if infix expression is valid
                  topOperator = operatorStack.pop();
                  while (topOperator != '(')
                  {
                     postfix = postfix.append(topOperator);
                     topOperator = operatorStack.pop();
                  } // end while
                  break;

               default: break; // Ignore unexpected characters
            } // end switch
         } // end if
      } // end for

      while (!operatorStack.isEmpty())
      {
         topOperator = operatorStack.pop();
         postfix = postfix.append(topOperator);
      } // end while

      return postfix.toString();
   } // end convertToPostfix

   // Indicates the precedence of a given operator.
   // Precondition: operator is a character that is (, ), +, -, *, /, or ^.
   // Returns an integer that indicates the precedence of operator:
   //         0 if ( or ), 1 if + or -, 2 if * or /, 3 if ^,
   //         -1 if anything else. */
   private static int getPrecedence(char operator)
   {
      switch (operator)
      {
         case '(': case ')': return 0;
         case '+': case '-': return 1;
         case '*': case '/': return 2;
         case '^':           return 3;
      } // end switch

      return -1;
   } // end getPrecedence

   private static boolean isVariable(char character)
   {
      return Character.isLetter(character);
   } // end isVariable

   /** Evaluates a postfix expression.
       Segment 5.18
       @param postfix  a string that is a valid postfix expression.
       @return  the value of the postfix expression. */
   public static double evaluatePostfix(String postfix)
   {
      StackInterface<Double> valueStack = new LinkedStack<Double>();
      int characterCount = postfix.length();

      for (int index = 0; index < characterCount; index++)
      {
         char nextCharacter = postfix.charAt(index);

         switch(nextCharacter)
         {
            case 'a': case 'b': case 'c': case 'd': case 'e':
               valueStack.push(valueOf(nextCharacter));
               break;

            case '+': case '-': case '*': case '/': case '^':
               Double operandTwo = valueStack.pop();
               Double operandOne = valueStack.pop();
               Double result = compute(operandOne, operandTwo, nextCharacter);
               valueStack.push(result);
               break;

            default: break; // Ignore unexpected characters
         } // end switch
      } // end for

      return (valueStack.peek()).doubleValue();
   } // end evaluatePostfix

   private static double valueOf(char variable)
   {
      switch (variable)
      {
         case 'a': return 2.5;
         case 'b': return 3.0;
         case 'c': return 4.0;
         case 'd': return 12.0;
         case 'e': return 16.5;
      } // end switch

      return 0; // Unexpected character
   } // end valueOf

   private static Double compute(Double operandOne, Double operandTwo, char operator)
   {
      double result;

      switch (operator)
      {
         case '+':
            result = operandOne.doubleValue() + operandTwo.doubleValue();
            break;

         case '-':
            result = operandOne.doubleValue() - operandTwo.doubleValue();
            break;

         case '*':
            result = operandOne.doubleValue() * operandTwo.doubleValue();
             break;

         case '/':
            result = operandOne.doubleValue() / operandTwo.doubleValue();
            break;

         case '^':
            result = Math.pow(operandOne.doubleValue(), operandTwo.doubleValue());
            break;

         default:    // Unexpected character
            result = 0;
            break;
      } // end switch

      return result;
   } // end compute
} // end Postfix

StackInterface.java:

/**
   An interface for the ADT stack.
   @author Frank M. Carrano
   @author Timothy M. Henry
   @version 4.0
*/
public interface StackInterface<T>
{
   /** Adds a new entry to the top of this stack.
       @param newEntry  An object to be added to the stack. */
   public void push(T newEntry);
  
   /** Removes and returns this stack's top entry.
       @return  The object at the top of the stack. 
       @throws  EmptyStackException if the stack is empty before the operation. */
   public T pop();
  
   /** Retrieves this stack's top entry.
       @return  The object at the top of the stack.
       @throws  EmptyStackException if the stack is empty. */
   public T peek();
  
   /** Detects whether this stack is empty.
       @return  True if the stack is empty. */
   public boolean isEmpty();
  
   /** Removes all entries from this stack. */
   public void clear();
} // end StackInterface

Driver.java:

/**
   A driver that demonstrates the class Postfix.
   
   @author Frank M. Carrano
   @author Timothy M. Henry
   @version 4.1
*/
public class Driver
{
        public static void main(String[] args) 
        {
                System.out.println("Testing postfix expressions with\n" +
                                   "a = 2, b = 3, c = 4, d = 5, e = 6\n\n");

                testPostfix("a+b");
                testPostfix("(a + b) * c");
                testPostfix("a * b / (c - d)");
                testPostfix("a / b + (c - d)");
                testPostfix("a / b + c - d");
                testPostfix("a^b^c");
                testPostfix("(a^b)^c");
                testPostfix("a*(b/c+d)");

                System.out.println("Testing Question 6, Chapter 5:\n");
                testPostfix("(a+b)/(c-d)");         // Question 6a, Chapter 5
                testPostfix("a/(b-c)*d");           // Question 6b
                testPostfix("a-(b/(c-d)*e+f)^g");   // Question 6c
                testPostfix("(a-b*c)/(d*e^f*g+h)"); // Question 6d

                System.out.println("Testing Question 7, Chapter 5:\n");
                System.out.println("Q7a: ae+bd-/ : "   + Postfix.evaluatePostfix("ae+bd-/") + "\n");
                System.out.println("Q7b: abc*d*- : "   + Postfix.evaluatePostfix("abc*d*-") + "\n");
                System.out.println("Q7c: abc-/d* : "   + Postfix.evaluatePostfix("abc-/d*") + "\n");
                System.out.println("Q7d: ebca^*+d- : " + Postfix.evaluatePostfix("ebca^*+d-") + "\n");
                System.out.println("\n\nDone.");
        }  // end main
        
        public static void testPostfix(String infixExpression)
        {
                System.out.println("Infix:   " + infixExpression);
                String postfixExpression =  Postfix.convertToPostfix(infixExpression);
                System.out.println("Postfix: " + postfixExpression);
                System.out.println("\n");
        } // end testPostfix 
}  // end Driver

/*
 Testing postfix expressions with
 a = 2, b = 3, c = 4, d = 5, e = 6
 
 
 Infix:   a+b
 Postfix: ab+
 
 
 Infix:   (a + b) * c
 Postfix: ab+c*
 
 
 Infix:   a * b / (c - d)
 Postfix: ab*cd-/
 
 
 Infix:   a / b + (c - d)
 Postfix: ab/cd-+
 
 
 Infix:   a / b + c - d
 Postfix: ab/c+d-
 
 
 Infix:   a^b^c
 Postfix: abc^^
 
 
 Infix:   (a^b)^c
 Postfix: ab^c^
 
 
 Infix:   a*(b/c+d)
 Postfix: abc/d+*
 
 
 Testing Question 6, Chapter 5:
 
 Infix:   (a+b)/(c-d)
 Postfix: ab+cd-/
 
 
 Infix:   a/(b-c)*d
 Postfix: abc-/d*
 
 
 Infix:   a-(b/(c-d)*e+f)^g
 Postfix: abcd-/e*f+g^-
 
 
 Infix:   (a-b*c)/(d*e^f*g+h)
 Postfix: abc*-def^*g*h+/
 
 
 Testing Question 7, Chapter 5:
 
 Q7a: ae+bd-/ : -4.0
 
 Q7b: abc*d*- : -58.0
 
 Q7c: abc-/d* : -10.0
 
 Q7d: ebca^*+d- : 49.0
 
 
 
 Done.
 */

Solutions

Expert Solution

Driver.java


import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class Driver
{
   public static void main(String[] args) throws FileNotFoundException {

       File text = new File("p4in.txt");
       CreateFile aFile = new CreateFile();
       aFile.openFile("p4out.txt");
       Scanner scnr = new Scanner(text);

       String s = String.format("%-40s%-30s%-30s%s", "Input", "Infix", "Postfix", "Result\n");
       String s2 = String.format("%65s%59s%8s%59s%8s", "Symbol Table\n", "Variable", "Value\n", "--------", "--------\n");
       String s3 = String.format("%56s%9s%56s%9s%56s%9s%56s%9s%56s%9s%56s%9s%56s%9s%56s%9s"
               , "a", "2\n", "b", "3\n", "c", "4\n", "d", "5\n", "e", "6\n", "f", "0\n", "g", "1\n", "h", "8\n");
       System.out.println(s2 + "\n" + s3);
       aFile.addRecords(s2);
       aFile.addRecords(s3);
       aFile.addRecords(s);
       System.out.println(s);
       while (scnr.hasNextLine()) {
           String line = scnr.nextLine();
           testPostfix(line, aFile);

       }

       aFile.closeFile();
   }
  
   public static void testPostfix(String input, CreateFile aFile)
   {

       String infixExpression = Postfix.convertToInfix(input);


       String postfixExpression = Postfix.convertToPostfix(infixExpression);

       double result = Postfix.evaluatePostfix(postfixExpression);

       String record = String.format("%-40s%-30s%-30s%s\n",input,infixExpression,postfixExpression,result);
       aFile.addRecords(record);
       System.out.println(record);
       System.out.println("\n");
   } // end testPostfix

} // end Driver

Postfix.java


public class Postfix
{

   public static String convertToInfix(String infix) {
      StackInterface<Character> operatorStack = new LinkedStack<Character>();
      StringBuilder infixExpression = new StringBuilder();
      int characterCount = infix.length();
      char topOperator;

      for (int index = 0; index < characterCount; index++) {
         char nextCharacter = infix.charAt(index);

         if (isInteger(nextCharacter)) {

            nextCharacter = characterChange(nextCharacter);
            infixExpression.append(nextCharacter);
         }
         else {
            switch (nextCharacter)
            {
               case 'a': case 'b': case 'c': case 'd': case 'e':case 'f': case 'g':case 'h':
               infixExpression.append(nextCharacter);
               break;               case '^':
               infixExpression.append(nextCharacter);
               break;

               case '+': case '-': case '*': case '/':
               infixExpression.append(nextCharacter);

               break;

               case '(':
                  infixExpression.append(nextCharacter);
                  break;

               case ')': // Stack is not empty if infix expression is valid

                  infixExpression.append(nextCharacter);
                  break;

               default: break; // Ignore unexpected characters
            } // end switch
         } // end if
      } // end for

      while (!operatorStack.isEmpty())
      {
         topOperator = operatorStack.pop();
         infixExpression = infixExpression.append(topOperator);
      } // end while

      return infixExpression.toString();
   } // end convertToPostfix

   /** Creates a postfix expression that represents a given infix expression.
       Segment 5.16.
       @param infix A string that is a valid infix expression.
       @return A string that is the postfix expression equivalent to infix. */
   public static String convertToPostfix(String infix)
   {
      StackInterface<Character> operatorStack = new LinkedStack<Character>();
      StringBuilder postfix = new StringBuilder();
      int characterCount = infix.length();
      char topOperator;

      for (int index = 0; index < characterCount; index++)
      {
         boolean done = false;
         char nextCharacter = infix.charAt(index);

         if (isVariable(nextCharacter))
            postfix = postfix.append(nextCharacter);
         else
         {
            switch (nextCharacter)
            {
               case '^':
                  operatorStack.push(nextCharacter);
                  break;

               case '+': case '-': case '*': case '/':
                  while (!done && !operatorStack.isEmpty())
                  {
                     topOperator = operatorStack.peek();

                     if (getPrecedence(nextCharacter) <= getPrecedence(topOperator))
                     {
                        postfix = postfix.append(topOperator);
                        operatorStack.pop();
                     }
                     else
                        done = true;
                  } // end while

                  operatorStack.push(nextCharacter);
                  break;

               case '(':
                  operatorStack.push(nextCharacter);
               break;

               case ')': // Stack is not empty if infix expression is valid
                  topOperator = operatorStack.pop();
                  while (topOperator != '(')
                  {
                     postfix = postfix.append(topOperator);
                     topOperator = operatorStack.pop();
                  } // end while
                  break;

               default: break; // Ignore unexpected characters
            } // end switch
         } // end if
      } // end for

      while (!operatorStack.isEmpty())
      {
         topOperator = operatorStack.pop();
         postfix = postfix.append(topOperator);
      } // end while

      return postfix.toString();
   } // end convertToPostfix


   private static int getPrecedence(char operator)
   {
      switch (operator)
      {
         case '(': case ')': return 0;
         case '+': case '-': return 1;
         case '*': case '/': return 2;
         case '^':           return 3;
      } // end switch

      return -1;
   } // end getPrecedence

   private static boolean isVariable(char character)
   {
      return Character.isLetter(character);
   } // end isVariable
   private static boolean isInteger(char character){return Character.isDigit(character);}

   /** Evaluates a postfix expression.
       Segment 5.18
       @param postfix a string that is a valid postfix expression.
       @return the value of the postfix expression. */
   public static double evaluatePostfix(String postfix)
   {
      StackInterface<Double> valueStack = new ArrayStack<Double>();
      int characterCount = postfix.length();

      for (int index = 0; index < characterCount; index++)
      {
         char nextCharacter = postfix.charAt(index);

         switch(nextCharacter)
         {
            case 'a': case 'b': case 'c': case 'd': case 'e':case 'f': case 'g':case 'h':
               valueStack.push(valueOf(nextCharacter));
               break;

            case '+': case '-': case '*': case '/': case '^':
               Double operandTwo = valueStack.pop();
               Double operandOne = valueStack.pop();
               Double result = compute(operandOne, operandTwo, nextCharacter);
               valueStack.push(result);
               break;

            default: break; // Ignore unexpected characters
         } // end switch
      } // end for

      return (valueStack.peek());
   } // end evaluatePostfix

   private static double valueOf(char variable)
   {
      switch (variable)
      {
         case 'a': return 2;
         case 'b': return 3;
         case 'c': return 4;
         case 'd': return 5;
         case 'e': return 6;
         case 'f': return 0;
         case 'g': return 1;
         case 'h': return 8;
      } // end switch

      return 0; // Unexpected character
   } // end valueOf

   private static Double compute(Double operandOne, Double operandTwo, char operator)
   {
      double result;

      switch (operator)
      {
         case '+':
            result = operandOne + operandTwo;
            break;

         case '-':
            result = operandOne - operandTwo;
            break;

         case '*':
            result = operandOne * operandTwo;
             break;

         case '/':
            result = operandOne / operandTwo;
            break;

         case '^':
            result = Math.pow(operandOne, operandTwo);
            break;

         default:    // Unexpected character
            result = 0;
            break;
      } // end switch

      return result;
   } // end compute

   public static char characterChange(char nextCharacter){

      switch(nextCharacter)
      {
         case '2': nextCharacter='a';
            break;
         case '3': nextCharacter='b';
            break;
         case '4': nextCharacter='c';
            break;
         case '5': nextCharacter='d';
            break;
         case '6': nextCharacter='e';
            break;
         case '0': nextCharacter='f';
            break;
         case '1': nextCharacter='g';
            break;
         case '8': nextCharacter='h';
         default:break;
      }
      return nextCharacter;
   }
} // end Postfix


CreateFile.java

import java.util.Formatter;


public class CreateFile {

    private Formatter file;


    //creates a file accepting a string representation of the path
    public void openFile(String filePath){
        try {
            file = new Formatter(filePath);
        }
        catch (Exception e){
            System.out.println("An error has occurred.");
        }
    }

    public void addRecords(String record){
        file.format("%S", record);
    }

    public void closeFile(){
        file.close();
    }
}

StackInterface.java


public interface StackInterface<T>
{
   /** Adds a new entry to the top of this stack.
       @param newEntry An object to be added to the stack. */
   public void push(T newEntry);

   /** Removes and returns this stack's top entry.
       @return The object at the top of the stack.
       @throws EmptyStackException if the stack is empty before the operation. */
   public T pop();

   /** Retrieves this stack's top entry.
       @return The object at the top of the stack.
       @throws EmptyStackException if the stack is empty. */
   public T peek();

   /** Detects whether this stack is empty.
       @return True if the stack is empty. */
   public boolean isEmpty();

   /** Removes all entries from this stack. */
   public void clear();
} // end StackInterface


ArrayStack.java

import java.util.Arrays;
import java.util.EmptyStackException;


public final class ArrayStack<T> implements StackInterface<T> {

    private T[] stack;
    private int topIndex;
    private boolean initialized = false;
    private static final int DEFAULT_CAPACITY = 50;
    private static final int MAX_CAPACITY = 10000;

    public ArrayStack() {
        this(DEFAULT_CAPACITY);
    }

    public ArrayStack(int initialCapacity) {

        checkCapacity(initialCapacity);

        @SuppressWarnings("unchecked")
                T[] tempStack = (T[])new Object[initialCapacity];
        stack = tempStack;
        topIndex = -1;
        initialized = true;
    }
    /** Adds a new entry to the top of this stack.
     @param newEntry An object to be added to the stack. */
    public void push(T newEntry) {
        checkInitialization();
        ensureCapacity();
        stack[topIndex + 1] = newEntry;
        topIndex++;
    }

    /** Removes and returns this stack's top entry.
     @return The object at the top of the stack.
     @throws EmptyStackException if the stack is empty before the operation. */
    public T pop() {
        checkInitialization();
        if(isEmpty()){
            throw new EmptyStackException();
        }
        else {
            T top = stack[topIndex];
            stack[topIndex] = null;
            topIndex--;
            return top;
        }

    }

    /** Retrieves this stack's top entry.
     @return The object at the top of the stack.
     @throws EmptyStackException if the stack is empty. */
    public T peek() {
        checkInitialization();
        if(isEmpty())
            throw new EmptyStackException();
        else
            return stack[topIndex];
    }

    /** Detects whether this stack is empty.
     @return True if the stack is empty. */
    public boolean isEmpty() {

        return topIndex < 0;
    }

    /** Removes all entries from this stack. */
    public void clear() {

        while(!isEmpty()){
            pop();
        }

    }

    private void checkInitialization(){
        if (!initialized)
            throw new SecurityException("Array object is not initialized properly.");
    }

    private void checkCapacity(int capacity){
        if (capacity > MAX_CAPACITY)
            throw new IllegalStateException("Attempt to create a bag whose capacity exceeds allowed maximum"
            + "of " + MAX_CAPACITY);
    }

    private void ensureCapacity(){
         if (topIndex == stack.length - 1){
             int newLength = 2 * stack.length;
             checkCapacity(newLength);
             stack = Arrays.copyOf(stack, newLength);
         }
    }
} // end StackInterface


LinkedStack.java

import java.util.EmptyStackException;

public final class LinkedStack<T> implements StackInterface<T>
{
   private Node topNode; // References the first node in the chain
  
   public LinkedStack()
   {
       topNode = null;
   } // end default constructor
  
   public void push(T newEntry)
   {
      topNode = new Node(newEntry, topNode);
//       Node newNode = new Node(newEntry, topNode);
//       topNode = newNode;
   } // end push

   public T peek()
   {
       if (isEmpty())
           throw new EmptyStackException();
       else
         return topNode.getData();
   } // end peek

   public T pop()
   {
       T top = peek(); // Might throw EmptyStackException
       assert (topNode != null);
      topNode = topNode.getNextNode();

       return top;
   } // end pop


   public boolean isEmpty()
   {
       return topNode == null;
   } // end isEmpty
  
   public void clear()
   {
       topNode = null; // Causes deallocation of nodes in the chain
   } // end clear

   private class Node
   {
      private T    data; // Entry in stack
      private Node next; // Link to next node

      private Node(T dataPortion)
      {
         this(dataPortion, null);
      } // end constructor

      private Node(T dataPortion, Node linkPortion)
      {
         data = dataPortion;
         next = linkPortion;  
      } // end constructor

      private T getData()
      {
         return data;
      } // end getData

      private void setData(T newData)
      {
         data = newData;
      } // end setData

      private Node getNextNode()
      {
         return next;
      } // end getNextNode

      private void setNextNode(Node nextNode)
      {
         next = nextNode;
      } // end setNextNode
   } // end Node
} // end LinkedStack


p4in.txt

2 + 3
( 2 + 3) * 4
2 * 3 / (4 - 5)
2 / 3 + (4 - 5)
2 / 3 + c - d
2 ^ 3 ^ 4
(2 ^ 3) ^ 4
2 * (3 / 4 + 5)
(2 + 3) / (4 - 5)
2 / (3 - 4) * 5
2 - (3 / (4 - 5) * 6 + 0) ^ 1
(2 - 3 * 4) / (5 * 6 ^ 0) * 1 + 8



Related Solutions

1. Use Boolean algebra to simplify the following Boolean expressions to expressions containing a minimum number...
1. Use Boolean algebra to simplify the following Boolean expressions to expressions containing a minimum number of literals: (a) A’C’ + A’BC + B’C (b) (A + B + C)’(ABC)’ (c) ABC’ + AC (d) A’B’D + A’C’D + BD (e) (A’ + B)’(A’ + C’)’(AB’C)’ (f) (AE + A’B’)(C’D’ + CD) + (AC)’ 2. Obtain the truth table of the function F = (AB + C)(B + AC), express the function F in sum-of-minterms and product-of-maxterms forms, and express...
Use psuedo-code for the following: 1) Assign a new student into the correct desk in a...
Use psuedo-code for the following: 1) Assign a new student into the correct desk in a room of students seated in alphabetical order. (Sort by just last name)
1.A pharmaceutical company is testing their new nicotine patch. They randomly assign 100 volunteers to use...
1.A pharmaceutical company is testing their new nicotine patch. They randomly assign 100 volunteers to use the patch and finding that 37 had quit smoking after 8 weeks. Compute the 96% confidence interval. You DO need to check CLT here. 2.For # 32 .In the United States, the population mean height for 3-year-old boys is 38 inches. Suppose a random sample of 30 non-U.S. 3-year-old boys showed a sample mean of 37.2 inches with a standard deviation of 3 inches....
i need a phone number with 9 digits but those digits should use only one time...
i need a phone number with 9 digits but those digits should use only one time and be dividable by 3-5-7-11-13-17 numbers.the phone number must not contain 0. Write a code with c sharp. note: answer is 869143275. i need to find this phone number
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT