Почему я вывожу только стек половинного размера? c

#c #stack #output

Вопрос:

Я пытаюсь вывести стек сверху вниз, что довольно просто. Однако после того, как я выполню приведенный ниже код.

 stack<int> myS;

for (int i = 0; i < 6; i  )
{
    myS.push(1);
}

for (int i = 0; i < myS.size(); i  )
{
    cout << myS.top();
    myS.pop();
}
 

Вывод '111' вместо '111111' . Хотя я нашел правильный способ его вывода, я все еще довольно смущен тем, где моя ошибка.

Комментарии:

1. Почему у вас myS.pop() … как вы думаете, что делает эта линия?

2. Это ваш собственный класс стека или std::stack ?

3. С каждым вызовом pop() размер стека уменьшается на единицу. Таким образом, после 3 итераций i равно 3, а myS.size() также равно 3, и цикл завершается

Ответ №1:

Когда вы вызываете pop() , верхний элемент удаляется, перемещая другие элементы вверх по слоту, и size() он уменьшается. Итак, 2-й элемент теперь является 1-м элементом, 3-й элемент теперь является 2-м элементом и так далее. Затем вы увеличиваете i , чтобы он указывал мимо недавно перемещенного верхнего элемента на следующий элемент. Из-за этого ваш цикл останавливается, когда он достигает точки на полпути в стеке.

Давайте развернем вашу pop петлю, чтобы увидеть, что она на самом деле делает:

 // size=6
i = 0;
cout << myS.top(); // print 1
myS.pop(); // size=5
i  ; //i=1
cout << myS.top(); // print 1
myS.pop(); // size=4
i  ; // i=2
cout << myS.top(); // print 1
myS.pop(); // size=3
i  ; // i=3
// i == size(), STOP
 

Вот почему вы видите напечатанными только 3 1 с.

Чтобы решить эту проблему, вы можете вместо этого сделать цикл в обратном направлении:

 for(int i = myS.size(); i > 0; --i)
{
    cout << myS.top();
    myS.pop();
}
 

Или while вместо этого используйте цикл:

 while (myS.size() > 0) // or: while (!myS.empty())
{
    cout << myS.top();
    myS.pop();
}