mirror of
https://github.com/krahets/hello-algo.git
synced 2026-06-15 22:57:48 +08:00
Add ru version (#1865)
* Add Russian docs site baseline * Add Russian localized codebase * Polish Russian code wording * Update ru code translation. * Update code translation and chapter covers. * Fix pythontutor extraction. * Add README and landing page. * placeholder of profiles * Use figures of English version * Remove chapter paperbook
This commit is contained in:
156
ru/codes/javascript/chapter_stack_and_queue/array_deque.js
Normal file
156
ru/codes/javascript/chapter_stack_and_queue/array_deque.js
Normal file
@@ -0,0 +1,156 @@
|
||||
/**
|
||||
* File: array_deque.js
|
||||
* Created Time: 2023-02-28
|
||||
* Author: Zhuo Qinyue (1403450829@qq.com)
|
||||
*/
|
||||
|
||||
/* Двусторонняя очередь на основе кольцевого массива */
|
||||
class ArrayDeque {
|
||||
#nums; // Массив для хранения элементов двусторонней очереди
|
||||
#front; // Указатель head, указывающий на первый элемент очереди
|
||||
#queSize; // Длина двусторонней очереди
|
||||
|
||||
/* Конструктор */
|
||||
constructor(capacity) {
|
||||
this.#nums = new Array(capacity);
|
||||
this.#front = 0;
|
||||
this.#queSize = 0;
|
||||
}
|
||||
|
||||
/* Получить вместимость двусторонней очереди */
|
||||
capacity() {
|
||||
return this.#nums.length;
|
||||
}
|
||||
|
||||
/* Получение длины двусторонней очереди */
|
||||
size() {
|
||||
return this.#queSize;
|
||||
}
|
||||
|
||||
/* Проверка, пуста ли двусторонняя очередь */
|
||||
isEmpty() {
|
||||
return this.#queSize === 0;
|
||||
}
|
||||
|
||||
/* Вычислить индекс в кольцевом массиве */
|
||||
index(i) {
|
||||
// С помощью операции взятия по модулю соединить начало и конец массива
|
||||
// Когда i выходит за конец массива, он возвращается в начало
|
||||
// Когда i выходит за начало массива, он возвращается в конец
|
||||
return (i + this.capacity()) % this.capacity();
|
||||
}
|
||||
|
||||
/* Добавление в голову очереди */
|
||||
pushFirst(num) {
|
||||
if (this.#queSize === this.capacity()) {
|
||||
console.log('Двусторонняя очередь заполнена');
|
||||
return;
|
||||
}
|
||||
// Указатель головы сдвигается на одну позицию влево
|
||||
// С помощью операции взятия по модулю front после выхода за начало массива возвращается в хвост
|
||||
this.#front = this.index(this.#front - 1);
|
||||
// Добавить num в голову очереди
|
||||
this.#nums[this.#front] = num;
|
||||
this.#queSize++;
|
||||
}
|
||||
|
||||
/* Добавление в хвост очереди */
|
||||
pushLast(num) {
|
||||
if (this.#queSize === this.capacity()) {
|
||||
console.log('Двусторонняя очередь заполнена');
|
||||
return;
|
||||
}
|
||||
// Вычислить указатель хвоста, указывающий на индекс хвоста + 1
|
||||
const rear = this.index(this.#front + this.#queSize);
|
||||
// Добавить num в хвост очереди
|
||||
this.#nums[rear] = num;
|
||||
this.#queSize++;
|
||||
}
|
||||
|
||||
/* Извлечение из головы очереди */
|
||||
popFirst() {
|
||||
const num = this.peekFirst();
|
||||
// Указатель головы сдвигается на одну позицию назад
|
||||
this.#front = this.index(this.#front + 1);
|
||||
this.#queSize--;
|
||||
return num;
|
||||
}
|
||||
|
||||
/* Извлечение из хвоста очереди */
|
||||
popLast() {
|
||||
const num = this.peekLast();
|
||||
this.#queSize--;
|
||||
return num;
|
||||
}
|
||||
|
||||
/* Доступ к элементу в начале очереди */
|
||||
peekFirst() {
|
||||
if (this.isEmpty()) throw new Error('The Deque Is Empty.');
|
||||
return this.#nums[this.#front];
|
||||
}
|
||||
|
||||
/* Доступ к элементу в конце очереди */
|
||||
peekLast() {
|
||||
if (this.isEmpty()) throw new Error('The Deque Is Empty.');
|
||||
// Вычислить индекс хвостового элемента
|
||||
const last = this.index(this.#front + this.#queSize - 1);
|
||||
return this.#nums[last];
|
||||
}
|
||||
|
||||
/* Вернуть массив для вывода */
|
||||
toArray() {
|
||||
// Преобразовывать только элементы списка в пределах фактической длины
|
||||
const res = [];
|
||||
for (let i = 0, j = this.#front; i < this.#queSize; i++, j++) {
|
||||
res[i] = this.#nums[this.index(j)];
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
/* Driver Code */
|
||||
/* Инициализация двусторонней очереди */
|
||||
const capacity = 5;
|
||||
const deque = new ArrayDeque(capacity);
|
||||
deque.pushLast(3);
|
||||
deque.pushLast(2);
|
||||
deque.pushLast(5);
|
||||
console.log('Двусторонняя очередь deque = [' + deque.toArray() + ']');
|
||||
|
||||
/* Доступ к элементу */
|
||||
const peekFirst = deque.peekFirst();
|
||||
console.log('Первый элемент peekFirst = ' + peekFirst);
|
||||
const peekLast = deque.peekLast();
|
||||
console.log('Последний элемент peekLast = ' + peekLast);
|
||||
|
||||
/* Добавление элемента в очередь */
|
||||
deque.pushLast(4);
|
||||
console.log('После добавления элемента 4 в хвост deque = [' + deque.toArray() + ']');
|
||||
deque.pushFirst(1);
|
||||
console.log('После добавления элемента 1 в голову deque = [' + deque.toArray() + ']');
|
||||
|
||||
/* Извлечение элемента из очереди */
|
||||
const popLast = deque.popLast();
|
||||
console.log(
|
||||
'Извлеченный из хвоста элемент = ' +
|
||||
popLast +
|
||||
', deque после извлечения из хвоста = [' +
|
||||
deque.toArray() +
|
||||
']'
|
||||
);
|
||||
const popFirst = deque.popFirst();
|
||||
console.log(
|
||||
'Извлеченный из головы элемент = ' +
|
||||
popFirst +
|
||||
', deque после извлечения из головы = [' +
|
||||
deque.toArray() +
|
||||
']'
|
||||
);
|
||||
|
||||
/* Получение длины двусторонней очереди */
|
||||
const size = deque.size();
|
||||
console.log('Длина двусторонней очереди size = ' + size);
|
||||
|
||||
/* Проверка, пуста ли двусторонняя очередь */
|
||||
const isEmpty = deque.isEmpty();
|
||||
console.log('Пуста ли двусторонняя очередь = ' + isEmpty);
|
||||
106
ru/codes/javascript/chapter_stack_and_queue/array_queue.js
Normal file
106
ru/codes/javascript/chapter_stack_and_queue/array_queue.js
Normal file
@@ -0,0 +1,106 @@
|
||||
/**
|
||||
* File: array_queue.js
|
||||
* Created Time: 2022-12-13
|
||||
* Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com)
|
||||
*/
|
||||
|
||||
/* Очередь на основе кольцевого массива */
|
||||
class ArrayQueue {
|
||||
#nums; // Массив для хранения элементов очереди
|
||||
#front = 0; // Указатель head, указывающий на первый элемент очереди
|
||||
#queSize = 0; // Длина очереди
|
||||
|
||||
constructor(capacity) {
|
||||
this.#nums = new Array(capacity);
|
||||
}
|
||||
|
||||
/* Получить вместимость очереди */
|
||||
get capacity() {
|
||||
return this.#nums.length;
|
||||
}
|
||||
|
||||
/* Получение длины очереди */
|
||||
get size() {
|
||||
return this.#queSize;
|
||||
}
|
||||
|
||||
/* Проверка, пуста ли очередь */
|
||||
isEmpty() {
|
||||
return this.#queSize === 0;
|
||||
}
|
||||
|
||||
/* Поместить в очередь */
|
||||
push(num) {
|
||||
if (this.size === this.capacity) {
|
||||
console.log('Очередь заполнена');
|
||||
return;
|
||||
}
|
||||
// Вычислить указатель хвоста, указывающий на индекс хвоста + 1
|
||||
// С помощью операции взятия по модулю вернуть rear к началу после выхода за конец массива
|
||||
const rear = (this.#front + this.size) % this.capacity;
|
||||
// Добавить num в хвост очереди
|
||||
this.#nums[rear] = num;
|
||||
this.#queSize++;
|
||||
}
|
||||
|
||||
/* Извлечь из очереди */
|
||||
pop() {
|
||||
const num = this.peek();
|
||||
// Указатель head сдвигается на одну позицию назад; если он выходит за конец, то возвращается в начало массива
|
||||
this.#front = (this.#front + 1) % this.capacity;
|
||||
this.#queSize--;
|
||||
return num;
|
||||
}
|
||||
|
||||
/* Доступ к элементу в начале очереди */
|
||||
peek() {
|
||||
if (this.isEmpty()) throw new Error('очередь пуста');
|
||||
return this.#nums[this.#front];
|
||||
}
|
||||
|
||||
/* Вернуть Array */
|
||||
toArray() {
|
||||
// Преобразовывать только элементы списка в пределах фактической длины
|
||||
const arr = new Array(this.size);
|
||||
for (let i = 0, j = this.#front; i < this.size; i++, j++) {
|
||||
arr[i] = this.#nums[j % this.capacity];
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
}
|
||||
|
||||
/* Driver Code */
|
||||
/* Инициализация очереди */
|
||||
const capacity = 10;
|
||||
const queue = new ArrayQueue(capacity);
|
||||
|
||||
/* Добавление элемента в очередь */
|
||||
queue.push(1);
|
||||
queue.push(3);
|
||||
queue.push(2);
|
||||
queue.push(5);
|
||||
queue.push(4);
|
||||
console.log('Очередь queue =', queue.toArray());
|
||||
|
||||
/* Доступ к элементу в начале очереди */
|
||||
const peek = queue.peek();
|
||||
console.log('Первый элемент peek = ' + peek);
|
||||
|
||||
/* Извлечение элемента из очереди */
|
||||
const pop = queue.pop();
|
||||
console.log('Извлеченный элемент pop = ' + pop + ', queue после извлечения =', queue.toArray());
|
||||
|
||||
/* Получение длины очереди */
|
||||
const size = queue.size;
|
||||
console.log('Длина очереди size = ' + size);
|
||||
|
||||
/* Проверка, пуста ли очередь */
|
||||
const isEmpty = queue.isEmpty();
|
||||
console.log('Пуста ли очередь = ' + isEmpty);
|
||||
|
||||
/* Проверка кольцевого массива */
|
||||
for (let i = 0; i < 10; i++) {
|
||||
queue.push(i);
|
||||
queue.pop();
|
||||
console.log('После ' + i + '-го раунда операций enqueue и dequeue queue =', queue.toArray());
|
||||
}
|
||||
75
ru/codes/javascript/chapter_stack_and_queue/array_stack.js
Normal file
75
ru/codes/javascript/chapter_stack_and_queue/array_stack.js
Normal file
@@ -0,0 +1,75 @@
|
||||
/**
|
||||
* File: array_stack.js
|
||||
* Created Time: 2022-12-09
|
||||
* Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com)
|
||||
*/
|
||||
|
||||
/* Стек на основе массива */
|
||||
class ArrayStack {
|
||||
#stack;
|
||||
constructor() {
|
||||
this.#stack = [];
|
||||
}
|
||||
|
||||
/* Получение длины стека */
|
||||
get size() {
|
||||
return this.#stack.length;
|
||||
}
|
||||
|
||||
/* Проверка, пуст ли стек */
|
||||
isEmpty() {
|
||||
return this.#stack.length === 0;
|
||||
}
|
||||
|
||||
/* Поместить в стек */
|
||||
push(num) {
|
||||
this.#stack.push(num);
|
||||
}
|
||||
|
||||
/* Извлечь из стека */
|
||||
pop() {
|
||||
if (this.isEmpty()) throw new Error('стек пуст');
|
||||
return this.#stack.pop();
|
||||
}
|
||||
|
||||
/* Доступ к верхнему элементу стека */
|
||||
top() {
|
||||
if (this.isEmpty()) throw new Error('стек пуст');
|
||||
return this.#stack[this.#stack.length - 1];
|
||||
}
|
||||
|
||||
/* Вернуть Array */
|
||||
toArray() {
|
||||
return this.#stack;
|
||||
}
|
||||
}
|
||||
|
||||
/* Driver Code */
|
||||
/* Инициализация стека */
|
||||
const stack = new ArrayStack();
|
||||
|
||||
/* Помещение элемента в стек */
|
||||
stack.push(1);
|
||||
stack.push(3);
|
||||
stack.push(2);
|
||||
stack.push(5);
|
||||
stack.push(4);
|
||||
console.log('Стек stack = ');
|
||||
console.log(stack.toArray());
|
||||
|
||||
/* Доступ к верхнему элементу стека */
|
||||
const top = stack.top();
|
||||
console.log('Верхний элемент top = ' + top);
|
||||
|
||||
/* Извлечение элемента из стека */
|
||||
const pop = stack.pop();
|
||||
console.log('Извлеченный элемент pop = ' + pop + ', stack после извлечения = ');
|
||||
console.log(stack.toArray());
|
||||
|
||||
/* Получение длины стека */
|
||||
const size = stack.size;
|
||||
console.log('Длина стека size = ' + size);
|
||||
|
||||
/* Проверка на пустоту */
|
||||
const isEmpty = stack.isEmpty();
|
||||
console.log('Пуст ли стек = ' + isEmpty);
|
||||
44
ru/codes/javascript/chapter_stack_and_queue/deque.js
Normal file
44
ru/codes/javascript/chapter_stack_and_queue/deque.js
Normal file
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* File: deque.js
|
||||
* Created Time: 2023-01-17
|
||||
* Author: Zhuo Qinyue (1403450829@qq.com)
|
||||
*/
|
||||
|
||||
/* Driver Code */
|
||||
/* Инициализация двусторонней очереди */
|
||||
// В JavaScript нет встроенной двусторонней очереди, поэтому Array можно использовать как двустороннюю очередь
|
||||
const deque = [];
|
||||
|
||||
/* Добавление элемента в очередь */
|
||||
deque.push(2);
|
||||
deque.push(5);
|
||||
deque.push(4);
|
||||
// Обратите внимание: поскольку используется массив, временная сложность метода unshift() равна O(n)
|
||||
deque.unshift(3);
|
||||
deque.unshift(1);
|
||||
console.log('Двусторонняя очередь deque = ', deque);
|
||||
|
||||
/* Доступ к элементу */
|
||||
const peekFirst = deque[0];
|
||||
console.log('Первый элемент peekFirst = ' + peekFirst);
|
||||
const peekLast = deque[deque.length - 1];
|
||||
console.log('Последний элемент peekLast = ' + peekLast);
|
||||
|
||||
/* Извлечение элемента из очереди */
|
||||
// Обратите внимание: поскольку используется массив, временная сложность метода shift() равна O(n)
|
||||
const popFront = deque.shift();
|
||||
console.log(
|
||||
'Извлеченный из головы элемент popFront = ' + popFront + ', deque после извлечения из головы = ' + deque
|
||||
);
|
||||
const popBack = deque.pop();
|
||||
console.log(
|
||||
'Извлеченный из хвоста элемент popBack = ' + popBack + ', deque после извлечения из хвоста = ' + deque
|
||||
);
|
||||
|
||||
/* Получение длины двусторонней очереди */
|
||||
const size = deque.length;
|
||||
console.log('Длина двусторонней очереди size = ' + size);
|
||||
|
||||
/* Проверка, пуста ли двусторонняя очередь */
|
||||
const isEmpty = size === 0;
|
||||
console.log('Пуста ли двусторонняя очередь = ' + isEmpty);
|
||||
167
ru/codes/javascript/chapter_stack_and_queue/linkedlist_deque.js
Normal file
167
ru/codes/javascript/chapter_stack_and_queue/linkedlist_deque.js
Normal file
@@ -0,0 +1,167 @@
|
||||
/**
|
||||
* File: linkedlist_deque.js
|
||||
* Created Time: 2023-02-04
|
||||
* Author: Zhuo Qinyue (1403450829@qq.com)
|
||||
*/
|
||||
|
||||
/* Узел двусвязного списка */
|
||||
class ListNode {
|
||||
prev; // Ссылка на узел-предшественник (указатель)
|
||||
next; // Ссылка на узел-преемник (указатель)
|
||||
val; // Значение узла
|
||||
|
||||
constructor(val) {
|
||||
this.val = val;
|
||||
this.next = null;
|
||||
this.prev = null;
|
||||
}
|
||||
}
|
||||
|
||||
/* Двусторонняя очередь на основе двусвязного списка */
|
||||
class LinkedListDeque {
|
||||
#front; // Головной узел front
|
||||
#rear; // Хвостовой узел rear
|
||||
#queSize; // Длина двусторонней очереди
|
||||
|
||||
constructor() {
|
||||
this.#front = null;
|
||||
this.#rear = null;
|
||||
this.#queSize = 0;
|
||||
}
|
||||
|
||||
/* Операция добавления в хвост очереди */
|
||||
pushLast(val) {
|
||||
const node = new ListNode(val);
|
||||
// Если связный список пуст, сделать так, чтобы и front, и rear указывали на node
|
||||
if (this.#queSize === 0) {
|
||||
this.#front = node;
|
||||
this.#rear = node;
|
||||
} else {
|
||||
// Добавить node в хвост списка
|
||||
this.#rear.next = node;
|
||||
node.prev = this.#rear;
|
||||
this.#rear = node; // Обновить хвостовой узел
|
||||
}
|
||||
this.#queSize++;
|
||||
}
|
||||
|
||||
/* Операция добавления в голову очереди */
|
||||
pushFirst(val) {
|
||||
const node = new ListNode(val);
|
||||
// Если связный список пуст, сделать так, чтобы и front, и rear указывали на node
|
||||
if (this.#queSize === 0) {
|
||||
this.#front = node;
|
||||
this.#rear = node;
|
||||
} else {
|
||||
// Добавить node в голову списка
|
||||
this.#front.prev = node;
|
||||
node.next = this.#front;
|
||||
this.#front = node; // Обновить головной узел
|
||||
}
|
||||
this.#queSize++;
|
||||
}
|
||||
|
||||
/* Операция извлечения из хвоста очереди */
|
||||
popLast() {
|
||||
if (this.#queSize === 0) {
|
||||
return null;
|
||||
}
|
||||
const value = this.#rear.val; // Сохранить значение хвостового узла
|
||||
// Удалить хвостовой узел
|
||||
let temp = this.#rear.prev;
|
||||
if (temp !== null) {
|
||||
temp.next = null;
|
||||
this.#rear.prev = null;
|
||||
}
|
||||
this.#rear = temp; // Обновить хвостовой узел
|
||||
this.#queSize--;
|
||||
return value;
|
||||
}
|
||||
|
||||
/* Операция извлечения из головы очереди */
|
||||
popFirst() {
|
||||
if (this.#queSize === 0) {
|
||||
return null;
|
||||
}
|
||||
const value = this.#front.val; // Сохранить значение хвостового узла
|
||||
// Удалить головной узел
|
||||
let temp = this.#front.next;
|
||||
if (temp !== null) {
|
||||
temp.prev = null;
|
||||
this.#front.next = null;
|
||||
}
|
||||
this.#front = temp; // Обновить головной узел
|
||||
this.#queSize--;
|
||||
return value;
|
||||
}
|
||||
|
||||
/* Доступ к элементу в конце очереди */
|
||||
peekLast() {
|
||||
return this.#queSize === 0 ? null : this.#rear.val;
|
||||
}
|
||||
|
||||
/* Доступ к элементу в начале очереди */
|
||||
peekFirst() {
|
||||
return this.#queSize === 0 ? null : this.#front.val;
|
||||
}
|
||||
|
||||
/* Получение длины двусторонней очереди */
|
||||
size() {
|
||||
return this.#queSize;
|
||||
}
|
||||
|
||||
/* Проверка, пуста ли двусторонняя очередь */
|
||||
isEmpty() {
|
||||
return this.#queSize === 0;
|
||||
}
|
||||
|
||||
/* Вывести двустороннюю очередь */
|
||||
print() {
|
||||
const arr = [];
|
||||
let temp = this.#front;
|
||||
while (temp !== null) {
|
||||
arr.push(temp.val);
|
||||
temp = temp.next;
|
||||
}
|
||||
console.log('[' + arr.join(', ') + ']');
|
||||
}
|
||||
}
|
||||
|
||||
/* Driver Code */
|
||||
/* Инициализация двусторонней очереди */
|
||||
const linkedListDeque = new LinkedListDeque();
|
||||
linkedListDeque.pushLast(3);
|
||||
linkedListDeque.pushLast(2);
|
||||
linkedListDeque.pushLast(5);
|
||||
console.log('Двусторонняя очередь linkedListDeque = ');
|
||||
linkedListDeque.print();
|
||||
|
||||
/* Доступ к элементу */
|
||||
const peekFirst = linkedListDeque.peekFirst();
|
||||
console.log('Первый элемент peekFirst = ' + peekFirst);
|
||||
const peekLast = linkedListDeque.peekLast();
|
||||
console.log('Последний элемент peekLast = ' + peekLast);
|
||||
|
||||
/* Добавление элемента в очередь */
|
||||
linkedListDeque.pushLast(4);
|
||||
console.log('После добавления элемента 4 в хвост linkedListDeque = ');
|
||||
linkedListDeque.print();
|
||||
linkedListDeque.pushFirst(1);
|
||||
console.log('После добавления элемента 1 в голову linkedListDeque = ');
|
||||
linkedListDeque.print();
|
||||
|
||||
/* Извлечение элемента из очереди */
|
||||
const popLast = linkedListDeque.popLast();
|
||||
console.log('Извлеченный из хвоста элемент = ' + popLast + ', linkedListDeque после извлечения из хвоста = ');
|
||||
linkedListDeque.print();
|
||||
const popFirst = linkedListDeque.popFirst();
|
||||
console.log('Извлеченный из головы элемент = ' + popFirst + ', linkedListDeque после извлечения из головы = ');
|
||||
linkedListDeque.print();
|
||||
|
||||
/* Получение длины двусторонней очереди */
|
||||
const size = linkedListDeque.size();
|
||||
console.log('Длина двусторонней очереди size = ' + size);
|
||||
|
||||
/* Проверка, пуста ли двусторонняя очередь */
|
||||
const isEmpty = linkedListDeque.isEmpty();
|
||||
console.log('Пуста ли двусторонняя очередь = ' + isEmpty);
|
||||
@@ -0,0 +1,99 @@
|
||||
/**
|
||||
* File: linkedlist_queue.js
|
||||
* Created Time: 2022-12-20
|
||||
* Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com)
|
||||
*/
|
||||
|
||||
const { ListNode } = require('../modules/ListNode');
|
||||
|
||||
/* Очередь на основе связного списка */
|
||||
class LinkedListQueue {
|
||||
#front; // Головной узел #front
|
||||
#rear; // Хвостовой узел #rear
|
||||
#queSize = 0;
|
||||
|
||||
constructor() {
|
||||
this.#front = null;
|
||||
this.#rear = null;
|
||||
}
|
||||
|
||||
/* Получение длины очереди */
|
||||
get size() {
|
||||
return this.#queSize;
|
||||
}
|
||||
|
||||
/* Проверка, пуста ли очередь */
|
||||
isEmpty() {
|
||||
return this.size === 0;
|
||||
}
|
||||
|
||||
/* Поместить в очередь */
|
||||
push(num) {
|
||||
// Добавить num после хвостового узла
|
||||
const node = new ListNode(num);
|
||||
// Если очередь пуста, сделать так, чтобы и head, и tail указывали на этот узел
|
||||
if (!this.#front) {
|
||||
this.#front = node;
|
||||
this.#rear = node;
|
||||
// Если очередь не пуста, добавить этот узел после хвостового узла
|
||||
} else {
|
||||
this.#rear.next = node;
|
||||
this.#rear = node;
|
||||
}
|
||||
this.#queSize++;
|
||||
}
|
||||
|
||||
/* Извлечь из очереди */
|
||||
pop() {
|
||||
const num = this.peek();
|
||||
// Удалить головной узел
|
||||
this.#front = this.#front.next;
|
||||
this.#queSize--;
|
||||
return num;
|
||||
}
|
||||
|
||||
/* Доступ к элементу в начале очереди */
|
||||
peek() {
|
||||
if (this.size === 0) throw new Error('очередь пуста');
|
||||
return this.#front.val;
|
||||
}
|
||||
|
||||
/* Преобразовать связный список в Array и вернуть */
|
||||
toArray() {
|
||||
let node = this.#front;
|
||||
const res = new Array(this.size);
|
||||
for (let i = 0; i < res.length; i++) {
|
||||
res[i] = node.val;
|
||||
node = node.next;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
/* Driver Code */
|
||||
/* Инициализация очереди */
|
||||
const queue = new LinkedListQueue();
|
||||
|
||||
/* Добавление элемента в очередь */
|
||||
queue.push(1);
|
||||
queue.push(3);
|
||||
queue.push(2);
|
||||
queue.push(5);
|
||||
queue.push(4);
|
||||
console.log('Очередь queue = ' + queue.toArray());
|
||||
|
||||
/* Доступ к элементу в начале очереди */
|
||||
const peek = queue.peek();
|
||||
console.log('Первый элемент peek = ' + peek);
|
||||
|
||||
/* Извлечение элемента из очереди */
|
||||
const pop = queue.pop();
|
||||
console.log('Извлеченный элемент pop = ' + pop + ', queue после извлечения = ' + queue.toArray());
|
||||
|
||||
/* Получение длины очереди */
|
||||
const size = queue.size;
|
||||
console.log('Длина очереди size = ' + size);
|
||||
|
||||
/* Проверка, пуста ли очередь */
|
||||
const isEmpty = queue.isEmpty();
|
||||
console.log('Пуста ли очередь = ' + isEmpty);
|
||||
@@ -0,0 +1,88 @@
|
||||
/**
|
||||
* File: linkedlist_stack.js
|
||||
* Created Time: 2022-12-22
|
||||
* Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com)
|
||||
*/
|
||||
|
||||
const { ListNode } = require('../modules/ListNode');
|
||||
|
||||
/* Стек на основе связного списка */
|
||||
class LinkedListStack {
|
||||
#stackPeek; // Использовать головной узел как вершину стека
|
||||
#stkSize = 0; // Длина стека
|
||||
|
||||
constructor() {
|
||||
this.#stackPeek = null;
|
||||
}
|
||||
|
||||
/* Получение длины стека */
|
||||
get size() {
|
||||
return this.#stkSize;
|
||||
}
|
||||
|
||||
/* Проверка, пуст ли стек */
|
||||
isEmpty() {
|
||||
return this.size === 0;
|
||||
}
|
||||
|
||||
/* Поместить в стек */
|
||||
push(num) {
|
||||
const node = new ListNode(num);
|
||||
node.next = this.#stackPeek;
|
||||
this.#stackPeek = node;
|
||||
this.#stkSize++;
|
||||
}
|
||||
|
||||
/* Извлечь из стека */
|
||||
pop() {
|
||||
const num = this.peek();
|
||||
this.#stackPeek = this.#stackPeek.next;
|
||||
this.#stkSize--;
|
||||
return num;
|
||||
}
|
||||
|
||||
/* Доступ к верхнему элементу стека */
|
||||
peek() {
|
||||
if (!this.#stackPeek) throw new Error('стек пуст');
|
||||
return this.#stackPeek.val;
|
||||
}
|
||||
|
||||
/* Преобразовать связный список в Array и вернуть */
|
||||
toArray() {
|
||||
let node = this.#stackPeek;
|
||||
const res = new Array(this.size);
|
||||
for (let i = res.length - 1; i >= 0; i--) {
|
||||
res[i] = node.val;
|
||||
node = node.next;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
/* Driver Code */
|
||||
/* Инициализация стека */
|
||||
const stack = new LinkedListStack();
|
||||
|
||||
/* Помещение элемента в стек */
|
||||
stack.push(1);
|
||||
stack.push(3);
|
||||
stack.push(2);
|
||||
stack.push(5);
|
||||
stack.push(4);
|
||||
console.log('Стек stack = ' + stack.toArray());
|
||||
|
||||
/* Доступ к верхнему элементу стека */
|
||||
const peek = stack.peek();
|
||||
console.log('Верхний элемент peek = ' + peek);
|
||||
|
||||
/* Извлечение элемента из стека */
|
||||
const pop = stack.pop();
|
||||
console.log('Извлеченный элемент pop = ' + pop + ', stack после извлечения = ' + stack.toArray());
|
||||
|
||||
/* Получение длины стека */
|
||||
const size = stack.size;
|
||||
console.log('Длина стека size = ' + size);
|
||||
|
||||
/* Проверка на пустоту */
|
||||
const isEmpty = stack.isEmpty();
|
||||
console.log('Пуст ли стек = ' + isEmpty);
|
||||
35
ru/codes/javascript/chapter_stack_and_queue/queue.js
Normal file
35
ru/codes/javascript/chapter_stack_and_queue/queue.js
Normal file
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* File: queue.js
|
||||
* Created Time: 2022-12-05
|
||||
* Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com)
|
||||
*/
|
||||
|
||||
/* Driver Code */
|
||||
/* Инициализация очереди */
|
||||
// В JavaScript нет встроенной очереди, поэтому Array можно использовать как очередь
|
||||
const queue = [];
|
||||
|
||||
/* Добавление элемента в очередь */
|
||||
queue.push(1);
|
||||
queue.push(3);
|
||||
queue.push(2);
|
||||
queue.push(5);
|
||||
queue.push(4);
|
||||
console.log('Очередь queue =', queue);
|
||||
|
||||
/* Доступ к элементу в начале очереди */
|
||||
const peek = queue[0];
|
||||
console.log('Первый элемент peek =', peek);
|
||||
|
||||
/* Извлечение элемента из очереди */
|
||||
// В основе лежит массив, поэтому временная сложность метода shift() равна O(n)
|
||||
const pop = queue.shift();
|
||||
console.log('Извлеченный элемент pop =', pop, ', queue после извлечения = ', queue);
|
||||
|
||||
/* Получение длины очереди */
|
||||
const size = queue.length;
|
||||
console.log('Длина очереди size =', size);
|
||||
|
||||
/* Проверка, пуста ли очередь */
|
||||
const isEmpty = queue.length === 0;
|
||||
console.log('Пуста ли очередь = ', isEmpty);
|
||||
35
ru/codes/javascript/chapter_stack_and_queue/stack.js
Normal file
35
ru/codes/javascript/chapter_stack_and_queue/stack.js
Normal file
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* File: stack.js
|
||||
* Created Time: 2022-12-04
|
||||
* Author: S-N-O-R-L-A-X (snorlax.xu@outlook.com)
|
||||
*/
|
||||
|
||||
/* Driver Code */
|
||||
/* Инициализация стека */
|
||||
// В JavaScript нет встроенного класса стека, поэтому Array можно использовать как стек
|
||||
const stack = [];
|
||||
|
||||
/* Помещение элемента в стек */
|
||||
stack.push(1);
|
||||
stack.push(3);
|
||||
stack.push(2);
|
||||
stack.push(5);
|
||||
stack.push(4);
|
||||
console.log('Стек stack =', stack);
|
||||
|
||||
/* Доступ к верхнему элементу стека */
|
||||
const peek = stack[stack.length - 1];
|
||||
console.log('Верхний элемент peek =', peek);
|
||||
|
||||
/* Извлечение элемента из стека */
|
||||
const pop = stack.pop();
|
||||
console.log('Извлеченный элемент pop =', pop);
|
||||
console.log('stack после извлечения =', stack);
|
||||
|
||||
/* Получение длины стека */
|
||||
const size = stack.length;
|
||||
console.log('Длина стека size =', size);
|
||||
|
||||
/* Проверка на пустоту */
|
||||
const isEmpty = stack.length === 0;
|
||||
console.log('Пуст ли стек =', isEmpty);
|
||||
Reference in New Issue
Block a user