Пример #1
0
def queue_to_stack(queue):
    """
    Converts the queue to a stack.
    """
    stk_ar = ArrayStack()
    q = ArrayQueue(queue)
    el = []
    while not q.isEmpty():
        el.append(q.pop())
    q1 = ArrayQueue(el[::-1])
    while not q1.isEmpty():
        stk_ar.push(q1.pop())
    return stk_ar
Пример #2
0
class Cashier(object):
    """Represents a cashier."""

    def __init__(self, number):
        """Maintains a cashier number, a queue of customers,
        number of customers served, total customer wait time,
        and a current customer being processed."""
        self._number = number
        self._totalCustomerWaitTime = 0
        self._customersServed = 0
        self._currentCustomer = None
        self._queue = ArrayQueue()

    def addCustomer(self, c):
        """Adds an arriving customer to my line."""
        self._queue.add(c)
   
    def serveCustomers(self, currentTime):
        """Serves my cuatomers during a given unit of time."""
        if self._currentCustomer is None:
            # No customers yet
            if self._queue.isEmpty():
                return
            else:
                # Pop first waiting customer and tally results
                self._currentCustomer = self._queue.pop()
                self._totalCustomerWaitTime += \
                                            currentTime - \
                                            self._currentCustomer.arrivalTime()
                self._customersServed += 1

        # Give a unit of service
        self._currentCustomer.serve()

        # If current customer is finished, send it away   
        if self._currentCustomer.amountOfServiceNeeded() == 0:
            self._currentCustomer = None
   
    def __str__(self):
        """Returns my results: my number, my total customers served,
        my average wait time per customer, and customers left on my queue."""
        if self._customersServed != 0:
            aveWaitTime = float(self._totalCustomerWaitTime) /\
                          self._customersServed
        else:
            aveWaitTime = 0.0
        result = "%4d %8d %13.2f %8d" % (self._number,
                                         self._customersServed,
                                         aveWaitTime,
                                         len(self._queue))
        return result
Пример #3
0
def queue_to_stack(queue):
    """
    Converts queue to stack.
    """
    temp_queue = ArrayQueue()
    temp_stack = ArrayStack()  #elements are in reversed order
    result_stack = ArrayStack()
    while not queue.isEmpty():
        elem = queue.pop()
        temp_queue.add(elem)
        temp_stack.push(elem)
    while not temp_queue.isEmpty():
        queue.add(temp_queue.pop())
    while not temp_stack.isEmpty():
        result_stack.push(temp_stack.pop())  #we reverse elements
    return result_stack
Пример #4
0
class TicketCounterSimulation():
    # Create a simulation object.
    def __init__(self, numAgents, numMinutes, betweenTime, serviceTime):
        # Parameters supplied by the user.
        self._arriveProb = 1.0 / betweenTime
        self._serviceTime = serviceTime
        self._numMinutes = numMinutes

        # Simulation components.
        self._passengerQ = ArrayQueue()
        self._theAgents = Array(numAgents)
        for i in range(numAgents):
            self._theAgents[i] = TicketAgent(i + 1)

        # Computed during the simulation.
        self._totalWaitTime = 0
        self._numPassengers = 0

    # Run the simulation using the parameters supplied earlier.
    def run(self):
        for curTime in range(self._numMinutes + 1):
            self._handleArrive(curTime)
            self._handleBeginService(curTime)
            self._handleEndService(curTime)

    # Print the simulation results.
    def printResults(self):
        numServed = self._numPassengers - len(self._passengerQ)
        avgWait = float(self._totalWaitTime) / numServed
        print("")
        print("Number of passengers served = ", numServed)
        print("Number of passengers remaining in line = %d" %
              len(self._passengerQ))
        print("The average wait time was %4.2f minutes." % avgWait)

    # Handles simulation rule #1.
    def _handleArrive(self, curTime):
        """
        Rule 1: If a customer arrives, he is added to the queue.
        At most, one customer can arrive during each time step.
        """
        if random.random() <= self._arriveProb:
            self._numPassengers += 1
            thePassenger = Passenger(self._numPassengers, curTime)
            print("Time {}: Passenger {} arrived.".format(
                curTime, self._numPassengers))
            self._passengerQ.add(thePassenger)

    # Handles simulation rule #2.
    def _handleBeginService(self, curTime):
        """
        Rule 2: If there are customers waiting, for each free server,
        the next customer in line begins her transaction.
        """
        for agent in self._theAgents:
            if agent.isFree():
                if not self._passengerQ.isEmpty():
                    thePassenger = self._passengerQ.pop()
                    agent.startService(thePassenger,
                                       curTime + self._serviceTime)
                    print("Time {}: Agent {} started serving passenger {}.".
                          format(curTime, agent._idNum, thePassenger._idNum))

    # Handles simulation rule #3.
    def _handleEndService(self, curTime):
        """
        Rule 3: For each server handling a transaction, if the transaction is complete, the
        customer departs and the server becomes free.
        """
        for agent in self._theAgents:
            if agent.isFinished(curTime):
                thePassenger = agent.stopService()
                self._totalWaitTime += curTime - thePassenger._arrivalTime - self._serviceTime
                print("Time {}: Agent {} stopped serving passenger {}.".format(
                    curTime, agent._idNum, thePassenger._idNum))