Example #1
0
class SortedStack:
    def __init__(self):
        self._stack = ArrayStack()

    def peek(self):
        return self._stack.peek()

    def pop(self):
        return self._stack.pop()

    def push(self, value):
        temp = ArrayStack()

        if self._stack.is_empty() or self._stack.peek() > value:
            self._stack.push(value)
        else:
            hold = value
            size = len(self._stack) + 1

            while len(self._stack) != size:
                if self.peek() < hold and self.peek() is not None:
                    temp.push(self.pop())
                elif hold is not None:
                    self._stack.push(hold)
                    hold = None
                else:
                    self._stack.push(temp.pop())
Example #2
0
class MyQueue:
    def __init__(self):
        self._stack = ArrayStack()
        self._inverted = False
        self._size = 0

    def peek(self):
        # stack = self._stack
        if self._stack.is_empty():
            raise Empty('Stack is empty')
        if not self._inverted:
            self.invert_stack()
        return self._stack.peek()

    def push(self, value):
        if self._inverted:
            self.invert_stack()
        self._stack.push(value)

    def pop(self):
        if self._stack.is_empty():
            raise Empty('Empty stack')
        if not self._inverted:
            self.invert_stack()
        return self._stack.pop()

    def invert_stack(self):
        temp = ArrayStack()
        self._inverted = not self._inverted

        while self._stack.peek() is not None:
            temp.push(self._stack.pop())
        self._stack = temp
Example #3
0
class MathOps(ArrayStack):
  def __init__(self):
    self.current_value = ArrayStack()
    self.current_value.push(0)
    self.redo_stack = ArrayStack()
    self.undo_stack = ArrayStack()
    ArrayStack.__init__(self)


  def evaluate_expression(self, right_operand, operator):
    """evaluate using inputed operater from current value w/ inputed right_operand and operator"""
    left_operand = self.current_value.peek()

    if operator == "+":
      evaluated_value = left_operand + right_operand
    if operator == "-":
      evaluated_value = left_operand - right_operand
    if operator == "/":
      evaluated_value = left_operand / right_operand
    if operator == "*":
      evaluated_value = left_operand * right_operand

    print("{} {} {} = {}\n".format(left_operand, operator, right_operand, evaluated_value))
    self.current_value.push(evaluated_value)



  def check_if_valid_operator(self, operater):
      valid_operators = ['+', '*', '/', '-']
      if operater not in valid_operators:
        raise TypeError("This message won't show up, will go straight to except block")
      else:
        return operater



  def parse_input(self, _input):
      valid_strings = ['u', 'r', 'q']

      if _input not in valid_strings:
        try:
          _input = int(_input)
          operator = input("Enter an operation: ")
          operator = self.check_if_valid_operator(operator)
          self.evaluate_expression(_input, operator)
        except:
          print("Invalid Input. Try Again\n")
          pass

      if _input == 'u':
        if self.current_value._size >= 2:
          self.redo_stack.push(self.current_value.pop())
          print("\n")
        else:
          print("No more actions to undo!\n")

      if _input == 'r':
        if self.redo_stack._size > 0:
          self.current_value.push(self.redo_stack.pop())
          print("\n")
        else:
          print("No more actions to undo!\n")

      if _input == 'q':
        print("Stopping Program\n")
        return True



  def run_script(self):
    stop = False
    while stop is not True:
      print("Current value is {}".format(self.current_value.peek()))
      input_string = input("Enter a number, 'u' to undo, 'r' to redo, 'q' to quit: ")
      return_string = self.parse_input(input_string)

      if return_string:
        stop = True