public class SequenceMunger {
  // sequence is a string of characters that we manipulate
  // buffer is the remaining part of sequence to be manipulated
  // output is the already-manipulated portion of sequence
  private String sequence, buffer, sequenceStack, output;
  
  /**
   * Create a SequenceMunger with sequence s
   * @param s Create SequenceMunger with sequence s.
   */
  public SequenceMunger(String s) {
    sequence = s;
    buffer = s;
    output = "";
    sequenceStack = "";
  }
  
  /**
   * reset: set buffer = sequence
   */
  public void reset() {
    buffer = sequence;
    output = "";
    sequenceStack = "";
  }
  
  /**
   * push: if buffer is non-empty remove its first character and add it to
   *       the beginning of stack.  Otherwise, do nothing.
   */
  public void push() {
    if (buffer.length() > 0) {
      sequenceStack = buffer.substring(0,1) + sequenceStack;
      buffer = buffer.substring(1);
    }
  }
  
  /**
   * popp: if stack is non-empty, remove its first character and add
   *      it to the beginning of output.  Otherwise, do nothing.
   */
  public void popp() {
    if (sequenceStack.length() > 0) {
      output = output + sequenceStack.substring(0,1);
      sequenceStack = sequenceStack.substring(1);
    }
  }
  
  /**
   * toString: Return the sequence, buffer, output, and sequenceStack as
   *           a String.
   */
  public String toString() {
    return "sequence:\t" + sequence + "\n" + 
      "buffer:\t" + buffer + "\n" +
      "stack:\t" + sequenceStack + "\n" +
      "output:\t" + output + "\n";
   }
  
}
