* Reorganized instruction text on multiple challenges * Fixed spaces * Fixed spaces again * Update curriculum/challenges/english/08-coding-interview-prep/data-structures/add-elements-at-a-specific-index-in-a-linked-list.english.md Co-Authored-By: Randell Dawson <5313213+RandellDawson@users.noreply.github.com> * Update curriculum/challenges/english/08-coding-interview-prep/data-structures/find-the-minimum-and-maximum-height-of-a-binary-search-tree.english.md Co-Authored-By: Randell Dawson <5313213+RandellDawson@users.noreply.github.com> * fix: added code tags
		
			
				
	
	
	
		
			6.1 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			6.1 KiB
		
	
	
	
	
	
	
	
id, title, challengeType
| id | title | challengeType | 
|---|---|---|
| 587d8255367417b2b2512c75 | Create a Circular Queue | 1 | 
Description
A good way to illustrate this concept is with an array of length 5:
[null, null, null, null, null]
 ^Read @ 0
 ^Write @ 0
Here the read and write are both at position 0. Now the queue gets 3 new records a, b, and c. Our queue now looks like:
[a, b, c, null, null]
 ^Read @ 0
          ^Write @ 3
As the read head reads, it can remove values or keep them:
[null, null, null, null, null]
                   ^Read @ 3
                   ^Write @ 3
Now we write the values d, e, and f to the queue.  Once the write reaches the end of the array it loops back to the beginning:
[f, null, null, d, e]
                ^Read @ 3
    ^Write @ 1
This approach requires a constant amount of memory but allows files of a much larger size to be processed.
Instructions
Tests
tests:
  - text: The <code>enqueue</code> method adds items to the circular queue.
    testString: assert((function(){ var test = new CircularQueue(3); test.enqueue(17); test.enqueue(32); test.enqueue(591); var print = test.print(); return print[0] === 17 && print[1] === 32 && print[2] === 591; })(), 'The <code>enqueue</code> method adds items to the circular queue.');
  - text: You cannot enqueue items past the read pointer.
    testString: assert((function(){ var test = new CircularQueue(3); test.enqueue(17); test.enqueue(32); test.enqueue(591); test.enqueue(13); test.enqueue(25); test.enqueue(59); var print = test.print(); return print[0] === 17 && print[1] === 32 && print[2] === 591; })(), 'You cannot enqueue items past the read pointer.');
  - text: The <code>dequeue</code> method dequeues items from the queue.
    testString: assert((function(){ var test = new CircularQueue(3); test.enqueue(17); test.enqueue(32); test.enqueue(591); return test.dequeue() === 17 && test.dequeue() === 32 && test.dequeue() === 591; })(), 'The <code>dequeue</code> method dequeues items from the queue.');
  - text: After an item is dequeued its position in the queue should be reset to <code>null</code>.
    testString: assert((function(){ var test = new CircularQueue(3); test.enqueue(17); test.enqueue(32); test.enqueue(672); test.dequeue(); test.dequeue(); var print = test.print(); return print[0] === null && print[1] === null && print[2] === 672; })(), 'After an item is dequeued its position in the queue should be reset to <code>null</code>.');
  - text: Trying to dequeue past the write pointer returns <code>null</code> and does not advance the write pointer.
    testString: assert((function(){ var test = new CircularQueue(3); test.enqueue(17); test.enqueue(32); test.enqueue(591); return test.dequeue() === 17 && test.dequeue() === 32 && test.dequeue() === 591 && test.dequeue() === null && test.dequeue() === null && test.dequeue() === null && test.dequeue() === null && test.enqueue(100) === 100 && test.dequeue() === 100; })(), 'Trying to dequeue past the write pointer returns <code>null</code> and does not advance the write pointer.');
Challenge Seed
class CircularQueue {
   constructor(size) {
     this.queue = [];
     this.read = 0;
     this.write = 0;
     this.max = size - 1;
     while (size > 0) {
        this.queue.push(null);
        size--;
     }
   }
   print() {
     return this.queue;
   }
   enqueue(item) {
    // Only change code below this line
    // Only change code above this line
   }
   dequeue() {
    // Only change code below this line
    // Only change code above this line
   }
}
Solution
class CircularQueue {
  constructor(size) {
    this.queue = [];
    this.read = 0;
    this.write = 0;
    this.max = size - 1;
    while (size > 0) {
      this.queue.push(null);
      size--;
    }
  }
  print() {
    return this.queue;
  }
  enqueue(item) {
    // Only change code below this line
    console.log(this.write, this.max);
    if (this.queue[this.write] === null) {
      this.queue[this.write++] = item;
      if (this.write > this.max) {
        this.write = 0;
      }
      return item;
    }
    return null;
    // Only change code above this line
  }
  dequeue() {
    // Only change code below this line
    if (this.queue[this.read] !== null) {
      let item = this.queue[this.read];
      this.queue[this.read++] = null;
      if (this.read > this.max) {
        this.read = 0;
      }
      return item;
    }
    return null;
    // Only change code above this line
  }
}