Как вернуть нижний элемент стека в C ++? - PullRequest
1 голос
/ 05 июля 2011

Я пытаюсь добавить дополнительный метод в мой класс 'stack', который будет возвращать нижний элемент в стеке.Однако .. У меня просто проблемы с тем, чтобы обернуть голову вокруг этого.Это код, который у меня пока есть в моем stack.cpp, но он не работает правильно:

bool Stack::bot(StackItemType& stackBottom){
  if (isEmpty()) return false;

  StackItems *temp = top;
  while (temp != NULL) {
    temp = temp->below;
  }

  stackBottom = temp->item;
  return true;
} // end bottom

Любая помощь?Спасибо.

Ответы [ 4 ]

4 голосов
/ 05 июля 2011

Стек предназначен , чтобы отображать только его верх.Это не имеет "дна", насколько вы обеспокоены.Не используйте стек, если вы хотите получить доступ к обоим концам коллекции!(Возможно, вы бы предпочли двустороннюю очередь или список?)

3 голосов
/ 05 июля 2011

Рассматривали ли вы использовать другую структуру данных.Стек действительно не предназначен для этого.Тем не менее, я не буду doochebag и не отвечу на ваш вопрос.

На первый взгляд, ваш код логически корректен, если вы реализуете свой стек со связанным списком и добавляете в негоэлемент во главе списка.Проблема с вашим кодом в том, что temp равен нулю в тот момент, когда он покидает цикл while.Попытка получить доступ к нулевому указателю является ошибкой.

Если вы измените условие while для использования temp-> ниже! = NULL, тогда temp будет указывать на допустимый элемент перед выходом из цикла while.

bool Stack::bot(StackItemType& stackBottom){
  if (isEmpty()) return false;

  StackItems *temp = top;
  while (temp->below != NULL) {
    temp = temp->below;
  }

  stackBottom = temp->item;
  return true;
} // end bottom
1 голос
/ 05 июля 2011

Я думаю, вы должны сделать

StackItems *temp = top;
while (temp->below != NULL) {
   temp = temp->below;
 }

Но стек - это LIFO.Здесь это не так: p

0 голосов
/ 05 июля 2011

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

Если бы вы использовали массив (надеюсь, динамический) для нижележащего хранилища, вы бы просто проиндексировали первый элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...