Paste number 27626: interview problem Pasted by: psykotic When: 13 years, 11 months ago Share: Tweet this! | http://paste.lisp.org/+LBE Channel: None Paste contents: Raw Source | XML | Display As text/plain image/svg+xml text/html application/xhtml+xml

The problem is to write a set of functions to manage a variable number of byte queues, each with variable length, in a small, fixed amount of memory. You should provide implementations of the following four functions: Q * createQ(); //Creates a FIFO byte queue, returning a handle to it. void destroyQ(Q * q); //Destroy an earlier created byte queue. void enQ(Q * q, unsigned char b); //Adds a new byte to a queue. unsigned char deQ(Q * q); //Pops the next byte off the FIFO queue. So, the output from the following set of calls: Q * q0 = createQ(); enQ(q0, 0); enQ(q0, 1); Q * q1 = createQ(); enQ(q1, 3); enQ(q0, 2); enQ(q1, 4); printf("%d", deQ(q0)); printf("%d

", deQ(q0)); enQ(q0, 5); enQ(q1, 6); printf("%d", deQ(q0)); printf("%d

", deQ(q0)); destroyQ(q0); printf("%d", deQ(q1)); printf("%d", deQ(q1)); printf("%d

", deQ(q1)); destroyQ(q1); should be: 0 1 2 5 3 4 6 You can define the type Q to be whatever you want. Your code is not allowed to call malloc() or other heap management routines. Instead, all storage (other than local variables in your functions) should be done in a provided array: unsigned char data[2048]; Memory efficiency is important. On average while your system is running, there will be a dozen or so queues with an average of 80 or so bytes in each queue. Your functions may be asked to create a larger number of queues with less bytes in each. Your functions may be asked to create a smaller number of queues with more bytes in each. If you are unable to satisfy a request due to lack of memory, your code should call a provided failure function, which will not return: void onOutOfMemory(); If the caller makes an illegal request, like attempting to deQ a byte from an empty queue, your code should call a provided failure function, which will not return: void onIllegalOperation(); Worst-case performance when adding and removing bytes is more important than average-case performance. There may be spikes in the number of queues allocated, or in the size of an individual queue. Your code should not assume a maximum number of bytes in a queue (other than that imposed by the total amount of memory available, of course!) You can assume that no more than 64 queues will be created at once.