Пополнение стека с использованием реализации узла

#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 ли переменная-член? Если да, то почему вы изменяете его внутри print ? print следует оставить ваш стек без изменений.

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. О, хорошо, я понимаю. Я всегда также мог понять, как хранить исходные элементы во временном стеке ... затем очистить временный стек, поместив их обратно в исходный стек по порядку. Спасибо.