* feat: added circular queue * fixed code block, adjusted pointer position relative to array entries * fix: code block
		
			
				
	
	
		
			82 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: Create a Circular Queue
 | |
| ---
 | |
| ## Create a Circular Queue
 | |
| 
 | |
| ### Method:
 | |
| - In this challenge we create a Circular Queue data structure.
 | |
| - First, we need to create an array of `size` with all elements set to `null`.
 | |
| - Then we create an equeue method, which moves the write pointer but doesnt exceed the read pointer.
 | |
| - The dequeue method on the other hand, moves the read pointer but doesnt exceed the write pointer.
 | |
| - Example:
 | |
|   - First, we create an array of length 5:
 | |
|   ```output
 | |
|   [null, null, null, null, null]
 | |
|    ^Read @ 0
 | |
|    ^Write @ 0
 | |
|   ```
 | |
|   - Then we enqueue `a`, `b`, and `c`:
 | |
|   ```output
 | |
|   [a, b, c, null, null]
 | |
|    ^Read @ 0
 | |
|             ^Write @ 3
 | |
|   ```
 | |
|   - Now we dequeue all the enqueued items:
 | |
|   ```output
 | |
|   [null, null, null, null, null]
 | |
|                      ^Read @ 3
 | |
|                      ^Write @ 3
 | |
|   ```
 | |
|   - Finally, we enqueue `d`, `e` and `f`:
 | |
|   ```output
 | |
|   [f, null, null, d, e]
 | |
|                   ^Read @ 3
 | |
|       ^Write @ 1
 | |
|   ```
 | |
| ### Solution:
 | |
| ```js
 | |
| 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) {
 | |
|      if (this.queue[this.write] === null){
 | |
|        this.queue[this.write++] = item;
 | |
|  
 | |
|        if (this.write > this.max) this.write = 0;
 | |
|        return item;
 | |
|      }
 | |
|      return null;
 | |
|     }
 | |
|  
 | |
|     dequeue() {
 | |
|       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;
 | |
|     }
 | |
|  }
 | |
|  ```
 | |
| ### References:
 | |
| 
 | |
| - [Wikipedia](https://en.wikipedia.org/wiki/Circular_buffer)
 |