class Queue {
constructor() {
this.back = null;
this.front = null;
}
push(value) {
const node = { value: value, next: null };
if (this.back) {
this.back.next = node;
}
this.back = node;
if (!this.front) {
this.front = node;
}
}
pop() {
const node = this.front;
if (node) {
this.front = node.next;
if (!this.front) this.back = null;
return node.value;
}
return null;
}
}
function runTests() {
const q = new Queue();
console.assert(q.pop() === null, "pop of an empty queue returns null");
console.assert(q.front === null, "front of recently created empty queue should be null");
console.assert(q.back === null, "back of recently created empty queue should be null");
q.push(1);
console.assert(q.pop() === 1, "pop of queue with a single element returns it");
console.assert(q.pop() === null, "pop of an empty queue returns null");
console.assert(q.front === null, "front of an empty queue should be null");
console.assert(q.back === null, "front of an empty queue should be null");
q.push("A");
q.push("B");
q.push("C");
console.assert(q.pop() === "A", "A: queue obeys FIFO property");
console.assert(q.pop() === "B", "B: queue obeys FIFO property");
console.assert(q.pop() === "C", "C: queue obeys FIFO property");
console.assert(q.pop() === null, "pop of an empty queue returns null");
console.assert(q.front === null, "front of an empty queue should be null");
console.assert(q.back === null, "front of an empty queue should be null");
}
runTests();