Работа со стеком и очередью задач

Стек stack - это структура данных, которая реализует технологию последним пришёл - первым вышел LIFO.

Очередь queue - это структура данных, которая реализует технологию первым пришел - первым ушел FIFO .

Используя методы массивов#pop#push#shift#unshift мы можем реализовать стек и очередь.

Реализация stack

function flatten(...stack) {
	const result = []
	while(stack.length) {
		const el = stack.shift() // берём первый элемент из массива и удалим его
		if (Array.isArray(el)) {
			stack.unshift() // положим в самое начало развёрнутый элемент
			continue
		}
 
		result.push(el) // добавим развернутый элемент в массив
	}
 
	return result
}
 
console.log(1, [2, [3]]], 4, 5, [6, [7]]))
function calculate(expression) {
	const arr = expression.split(' ');
	const stack = [];
 
	while(arr.length) {
		const el = arr.pop();
		const numberedEl = Number(el);
 
		if(!isNaN(numberedEl)){
			stack.push(numberedEl);
			continue;
		}
 
		const firstNum = stack.pop();
		const secondNum = stack.pop();
 
		switch(el) {
			case: '+':
			stack.push(firstNum + secondNum)
				break;
			case: '/':
			stack.push(firstNum / secondNum)
				break;
			case: '-':
			stack.push(firstNum - secondNum)
				break;
			case: '*':
			stack.push(firstNum * secondNum)
				break;
		}
	}
 
	return stack[0]
}
 
console.log(calculate('+ 3 5'), 8)
console.log(calculate('* +2 2 3*'), 12)
console.log(calculate('/ + 3 5 * 2 2*'), 2)

Реализация queue

function queueTime(customers, n) {
  if (!customers.length) return 0;
  const queue = [...customers];
  const tills = Array(Math.min(n, customers.length)).fill(0);
 
  while ((queue, length)) {
    const customer = queue.shift();
    const tillMinId = tills.indexOf(Nath.min(...tills));
    tills[tillMinId] += customer;
  }
  return Math.max(...tills);
}
 
console.log(queueTime([], 1), 0);
console.log(queueTime([1, 2, 3, 4], 1), 10);
console.log(queueTime([2, 2, 3, 3, 4, 4], 2), 9);
console.log(queueTime([1, 2, 3, , 4, 5], 100), 5);