Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2021, 13:36   #1
theSerg
 
Регистрация: 02.08.2021
Сообщений: 4
По умолчанию Стек на JavaScript. Как реализовать метод reverse() ?

Приветствую всех, имеется следующая задачка:

Односвязный стек.

Давайте реализуем стек на основе односвязного стека. Значения стека будем хранить в обёртке, где помимо значения будет указатель на нижний в стеке элемент, в самом же стеке будем хранить указатель на самый верхний элемент

Давайте реализуем две основные для стека операции push и pop. Для push создадим обёртку для нового значения, на который теперь будет указывать голова стека, а на старую голову будет указывать указатель на предыдущий элемент в обёртке. Для pop вынем значение из обёртки, на которую указывает голова стека, после чего передвинeм голову стека на ту обёртку, на которую указывал указатель на предыдущий элемент в голове стека.

Теперь давайте добавим метод вывода стека на экран printMe, который будет выводить стек в консоль следующим образом: если стек пустой то выведет "EMPTY", иначе если есть предыдущий элемент, то выведет "[элемент] -> [предыдущий элемент]", к примеру набрав следующие код:


Код:
const stack = new Stack();
stack.printMe()
console.log('Добавим 0');
stack.push(0);
stack.printMe()
console.log('Добавим 1');
stack.push(1);
stack.printMe()
console.log('Добавим 2')
stack.push(2);
stack.printMe()
console.log('Добавим 3')
stack.push(3)
stack.printMe()
console.log('Добавим 4')
stack.push(4)
stack.printMe()
console.log('Добавим 5')
stack.push(5)
stack.printMe()
console.log(`Снимем со стека ${stack.pop()}`)
stack.printMe()
console.log(`Снимем со стека ${stack.pop()}`)
stack.printMe()
Должен получиться следующий вывод:

Код:
EMPTY
Добавим 0
0
Добавим 1
1 -> 0
Добавим 2
2 -> 1 -> 0
Добавим 3
3 -> 2 -> 1 -> 0
Добавим 4
4 -> 3 -> 2 -> 1 -> 0
Добавим 5
5 -> 4 -> 3 -> 2 -> 1 -> 0
Снимем со стека 5
4 -> 3 -> 2 -> 1 -> 0
Снимем со стека 4
3 -> 2 -> 1 -> 0
И ещё один метод: reverse(), который бы возвращал новый стек, в котором те же элементы, но в обратном порядке. Это сделаем рекурсивно, напишем вспомогательную функцию, которая будет принимать односвязный список и будет возвращать два значения: голову и хвост нового списка, который является ревёрсом (т.е. в обратном порядке) исходного списка. Для языков, где нельзя вернуть несколько значений, заведите, например, вспомогательный класс, объект которого вы заполните возвращаемыми значениями и вернёте как результат функции.
Если набрать следующий код:

Код:
console.log('Ревёрс!');
stack = stack.reverse();
stack.printMe()
console.log(`Снимем со стека ${stack.pop()}`)
stack.printMe();
console.log(`Снимем со стека ${stack.pop()}`)
stack.printMe();
console.log('Ревёрс!');
stack = stack.reverse();
stack.printMe()
console.log(`Снимем со стека ${stack.pop()}`)
stack.printMe();
console.log(`Снимем со стека ${stack.pop()}`)
stack.printMe();
Должен получиться следующий вывод:

Код:
Ревёрс!
0 -> 1 -> 2 -> 3
Снимем со стека 0
1 -> 2 -> 3
Снимем со стека 1
2 -> 3
Ревёрс!
3 -> 2
Снимем со стека 3
2
Снимем со стека 2
EMPTY
Не могу никак понять как реализовать метод reverse(), помогите пожалуйста разобраться с этим вопросом, с остальным вроде разобрался, вот моя реализация:

Код:
class Node {
  constructor(value, prev = null) {
    this.value = value;
    this.prev = prev;
  }
}

class Stack {
  constructor() {
    this.head = null;
  }

  push(value) {
    if (!this.head) {
      this.head = new Node(value);
    } else {
      this.head = new Node(value, this.head)
    }
  }

  pop() {
    if (!this.head) {
      console.log('Нет элементов');
    } else {
      let current = this.head.value;
      this.head = this.head.prev;
      return current;
    }
  }

  printMe() {
    if (!this.head) {
      console.log('EMPTY');
    } else {
      let node = this.head;
      let acc = node.value;
      if (node.prev) {
      while (node.prev) {
          acc += ` -> `;
          node = node.prev;
          acc += node.value;
        }
      }
      console.log(`${acc}`)
    }
  }

  reverse() {
    ???????????
  }
}

const stack = new Stack();

stack.printMe()
console.log('____________________________', '\n')
console.log('Добавим 0');
stack.push(0);
stack.printMe()
console.log('____________________________', '\n')
console.log('Добавим 1');
stack.push(1);
stack.printMe()
console.log('____________________________', '\n')
console.log('Добавим 2')
stack.push(2);
stack.printMe()
console.log('____________________________', '\n')
console.log('Добавим 3')
stack.push(3)
stack.printMe()
console.log('____________________________', '\n')
console.log('Добавим 4')
stack.push(4)
stack.printMe()
console.log('____________________________', '\n')
console.log('Добавим 5')
stack.push(5)
stack.printMe()
console.log('____________________________', '\n')
console.log(`Снимем со стека ${stack.pop()}`)
stack.printMe()
console.log('____________________________', '\n')
console.log(`Снимем со стека ${stack.pop()}`)
stack.printMe()
console.log('____________________________', '\n')
console.log(stack)
theSerg вне форума Ответить с цитированием
Старый 09.08.2021, 14:49   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Как-то так (без проверки):
Код:
let node = this.head;
this.head = null;
while (node){
  this.push(node.value);
  node = node.prev;
}
Arigato вне форума Ответить с цитированием
Старый 09.08.2021, 15:36   #3
theSerg
 
Регистрация: 02.08.2021
Сообщений: 4
По умолчанию

Спасибо большое), как говорится, всё гениальное просто, ваша реализация метода работает, единственное, в конце добавил return this, иначе не работало, ещё раз спасибо)
theSerg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как реализовать метод Р. Ковэю в Паскале? Korlet Помощь студентам 0 20.12.2015 20:48
реализовать метод Эйлера и метод Рунге-Кутте 4-ого порядка на языке С++ Janny2014 Помощь студентам 1 27.11.2013 05:23
как в javascript реализовать php-функцию preg_match()? sarkozy JavaScript, Ajax 3 25.05.2010 23:27
ПИД-регуляторы: как реализовать ПД-метод cadil Общие вопросы Delphi 3 03.05.2010 22:32