#c #stack #implementation #nodes #fill
#c #стек #реализация #узлы #заполнить
Вопрос:
Мне трудно повторно заполнить стек после того, как я все это удалю, чтобы распечатать его. Я использую реализацию узла, поэтому я думаю, что этот факт меня смущает. Любые предложения будут оценены, спасибо.
Это мой оригинальный стек::print()
// Function to print Gumball info field (color and counter)
void Stack::print()
{
Node *p;
Type x;
while(top != NULL) {
p = top;
x = p -> getinfo();
cout << " " << x.color << " " << " " << x.counter << endl << endl;
top = p -> getnext();
}
return;
}
This is my stack with my attempt to loop and store in temp. It compiles but still is not working as suppose to
void Stack::print()
{
Node *p,*q;
Type x,x_temp;
while(top != NULL) {
p = top;
x = p -> getinfo();
cout << " " << x.color << " " << " " << x.counter << endl << endl;
x_temp = x;
q = top;
top = p -> getnext();
}
while(top != NULL) {
q -> setinfo(x_temp);
q -> setnext(top);
top = q;
}
return;
}
Комментарии:
1. Является
top
ли переменная-член? Если да, то почему вы изменяете его внутри2. Я попытался изменить его только для печати стека, а затем вернуть все обратно в исходное состояние .... в основном получить информацию сверху, распечатать ее, а затем перейти к следующему gumball. После этого я хочу переместить все из временного стека обратно в оригинал в том же порядке.
Ответ №1:
Если вы хотите распечатать содержимое стека, а затем вернуть все значения обратно в том же порядке, я бы предложил поместить значения в другой стек после их печати. Затем, как только исходный стек опустеет, поместите все значения из второго стека обратно в исходный стек.
Комментарии:
1. Я отредактировал свой вопрос... Я показал свою попытку сохранить во временном стеке и вернуть все элементы из temp обратно в исходный стек, см. Мой первоначальный вопрос.
Ответ №2:
Stack::print
показывает текущий "snapshop" вашего стека, поэтому он не имеет права изменять какие Stack
-либо переменные-члены. Нет необходимости делать "резервную копию" стека и восстанавливать его. Вам просто нужно пройти по стеку так, чтобы не нарушать работу стека.
Вместо того, чтобы заставлять top
переменную-член перемещаться по стеку, инициализируйте локальный Node
указатель таким же, как top
и, и заставьте локальный указатель перемещаться по стеку.
Другими словами, top
должен быть доступен только для чтения (неизменяемый) в вашей print
функции-члене. Чтобы обеспечить, чтобы функция-член не должна изменять какие-либо переменные-члены, вы можете сделать функцию-член неизменяемой, добавив const
ключевое слово в конце объявления вашей функции-члена.
Пример:
// Const member function enforces that the Stack remain unmodified
void Stack::print() const
{
Node *p = top; // Make p initially point to the top of the stack
Type x;
while(p != NULL) {
x = p -> getinfo();
cout << " " << x.color << " " << " " << x.counter << endl << endl;
p = p->getNext(); // Make p walk down the stack to the next Node.
}
}
Комментарии:
1. О, хорошо, я понимаю. Я всегда также мог понять, как хранить исходные элементы во временном стеке ... затем очистить временный стек, поместив их обратно в исходный стек по порядку. Спасибо.